在Java JMS Spring中为方法参数声明final

时间:2013-08-08 13:07:41

标签: java spring jms

我在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的最终意义是什么?

4 个答案:

答案 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(即它不能更改其引用的对象/值)。