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

匿名クラスで。messagesendMessage が返され、スタック上のパラメーターとローカル変数がなくなった後でも、MessageCreator の子が使用されます。

したがって、実際には変数のコピーが MessageCreator の子で作成されます。そして、Java の設計者は、同じ名前の背後にある両方の変数を final にするのが賢明だと考えました。そうしないと、コピーの同期が必要になります。

したがって、パラメーターとローカル変数は final である必要があります。

于 2013-08-08T13:13:51.253 に答える
2

これは、 sendMessageメソッド内で Stringメッセージに他の値を割り当てることが許可されていないことを意味します。次のようなことをすると、コンパイル時エラーが発生します。

message="just test";

sendMessage内。

于 2013-08-08T13:10:50.367 に答える
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 でなければなりません (つまり、参照されるオブジェクト/値を変更することはできません)。

于 2013-08-08T13:17:03.303 に答える
0

後でメッセージを変更できないようにするためのセキュリティ対策だと思います。final と宣言されている場合は、String 値を 1 回だけ割り当てることができます (このシナリオでメソッドが呼び出されたとき)。これがあなたが望んでいた答えだったかどうかはわかりません。質問が間違っている場合は、コメントを追加してください。

于 2013-08-08T13:14:36.870 に答える