Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java JMS Spring中为方法参数声明final_Java_Spring_Jms - Fatal编程技术网

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

在Java JMS Spring中为方法参数声明final,java,spring,jms,Java,Spring,Jms,我在Spring中遇到了以下JMS方法。该类基本上向ActiveMQ my message Queue Server发送消息,并使用以下方法: public void sendMessage(final String message) { this.jmsTemplate.send(new MessageCreator() { public Message createMessage(Session session) throws JMSException {

我在Spring中遇到了以下JMS方法。该类基本上向ActiveMQ my 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);
        }
    });     
}
我的问题是,声明String final类型的方法参数消息有什么意义?

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

message="just test";
在sendMessage内部。

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

message="just test";

在sendMessage中。

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

因此,实际上,变量的副本是在MessageCreator子级中创建的。java设计人员认为,将同一名称后面的两个变量作为最终变量是明智的;否则,他们将需要一些复制的同步


因此,参数和局部变量必须是最终的。

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

因此,实际上,变量的副本是在MessageCreator子级中创建的。java设计人员认为,将同一名称后面的两个变量作为最终变量是明智的;否则,他们将需要一些复制的同步


因此,参数和局部变量必须是最终的。

我想这是一种安全措施,防止您在事后更改消息。如果声明为final,则在本场景中调用该方法时,只能将字符串值oncee赋值。我不确定这是不是你想要的答案。如果我答错了您的问题,请添加任何注释。

我猜这是一种安全措施,防止您在事后更改邮件。如果声明为final,则在本场景中调用该方法时,只能将字符串值oncee赋值。我不确定这是不是你想要的答案。如果我答错了您的问题,请添加任何注释。

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

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

引用对象/值的每个变量都必须是最终变量,因为如果按如下方式更改其值:

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);
        }
    });     
}
编译器无法识别消息变量已更改其引用的对象,因此您将无法获得预期的行为


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

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

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

引用对象/值的每个变量都必须是最终变量,因为如果按如下方式更改其值:

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,即它不能更改其引用的对象/值