1

我在 Spring for JMS 中遇到了以下方法。该类基本上向 ActiveMQ(我的消息队列服务器)发送消息,它使用以下方法:

public void sendMessage(final String message) {
    this.jmsTemplate.send(new MessageCreator() {
        public Message createMessage(Session session) throws JMSException {
            return session.createTextMessage(message);
        }
    });     
}

我的问题是声明finalmessage类型的方法参数有什么意义?String

4

4 回答 4

3

在匿名类中。使用MessageCreatormessage的子级,即使在 sendMessage 返回并且堆栈上的参数和局部变量不再存在之后。

因此,实际上在 MessageCreator 子项中制作了变量的副本。Java 设计者认为将同名后的两个变量设为 final 是明智的;否则他们将需要一些同步复制。

因此参数和局部变量需要是最终的。

于 2013-08-08T13:13:51.253 回答
2

这意味着不允许在sendMessage方法中为 String消息分配任何其他值。如果您执行以下操作,您将收到编译时错误:

message="just test";

sendMessage里面。

于 2013-08-08T13:10:50.367 回答
0

我猜这是一种安全措施,可以防止您事后更改消息。如果它被声明为 final,则只能分配一次 String 值(在这种情况下调用该方法时)。我不确定这是你想要的答案。如果我的问题有误,请添加任何评论。

于 2013-08-08T13:14:36.870 回答
0

当您实例化扩展的未命名类时,MessageCreatorJava 编译器允许您访问本地范围以引用在新的未命名类定义之外使用的对象。

它通过将新的未命名类与变量提到的对象的引用静态关联来实现这一点。

每个引用对象/值的变量都必须是最终的,因为如果你像这样动态地更改它的值:

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);
        }
    });     
}

编译器无法识别消息变量已更改其引用对象,因此您不会得到预期的行为。

因此,内部未命名类中的每个引用都必须是最终的(即它不能更改其引用的对象/值)。

于 2013-08-08T13:17:03.303 回答