我在Spring for JMS中遇到过以下方法。该类基本上向ActiveMQ(我的Message Queue Server)发送消息,它使用以下方法:
public void sendMessage(final String message) {
this.jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(message);
}
});
}
我的问题是声明message
类型的方法参数String
的最终意义是什么?
答案 0 :(得分:3)
在匿名课堂上。即使在sendMessage返回并且堆栈上的参数和局部变量不再存在之后,也会使用MessageCreator message
的子项。
实际上,在MessageCreator子项中创建了变量的副本。并且java设计者认为将两个变量置于同名后面是明智的;否则他们需要一些复制同步。
因此,参数和局部变量必须是最终的。
答案 1 :(得分:2)
这意味着不允许在 sendMessage 方法中为String 消息分配任何其他值。如果您执行以下操作,则会出现编译时错误:
message="just test";
在 sendMessage 中。
答案 2 :(得分:0)
我猜这是一种安全措施,阻止您之后更改消息。如果它被声明为final,则只能分配一次String值(在此场景中调用方法时)。我不确定这是你想要的答案。如果我的问题出错,请添加任何评论。
答案 3 :(得分:0)
当您实例化扩展MessageCreator
的未命名类时,Java编译器允许您访问本地范围,以引用在新的未命名类定义之外使用的对象。
通过将新的未命名类与变量提及的对象的引用静态关联来实现。
引用对象/值的每个变量都必须是final,因为如果你改变它的值,就像:
public void sendMessage(String message) {
this.jmsTemplate.send(new MessageCreator() {
... // some code
message = // something else
...
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(message);
}
});
}
编译器无法识别消息变量已更改其引用的对象,因此您将无法获得预期的行为。
因此,内部未命名类中的每个引用都必须是final(即它不能更改其引用的对象/值)。