1

Cannot refer to a non-final variable message inside an inner class defined in a different method私は次の onMessage メソッドを取得していました。

@Override
public void onMessage(Message msg) {

    if (msg instanceof ActiveMQMessage){
        try {
             ActiveMQMessage aMsg =  (ActiveMQMessage)msg;

             String message = ""; // I cant use final here because my if else message assingment
                int consumerCount =(Integer) aMsg.getProperty("consumerCount");

                if(consumerCount == 0 ){
                    message = "No cousumers for queue bank.7083 (HNB Bank)";
                }else{
                    message = "Added new consumer to bank.7083 (HNB Bank) total counsumers : "+consumerCount;
                }


                final MessageCreator request = new MessageCreator() {

                    public Message createMessage(final Session session) throws JMSException {
                        TextMessage textMessage = session.createTextMessage();
                        textMessage.setText(message); // I’m getting compilation issue here
                        return textMessage;
                    }
                };

                amqTemplate.send("HUTCH", request);


        } catch (IOException e) {
            e.printStackTrace();
        }


    }

次にString [] messages = new String[1]、代わりに配列を使用String messageし、コードを次のように変更しました。

.
.
.
                final String[]  message = new String[1];
if(consumerCount == 0 ){
                    message[0] = "No cousumers for queue bank.7083 (HNB Bank)";
                }else{
                    message[0] = "Added new consumer to bank.7083 (HNB Bank) total counsumers : "+consumerCount;
                }

.
.
.
textMessage.setText(message[0]);

そして、問題なくコンパイルされました。私の理解では、メッセージ [0] は最終的なものではありません。そのため、メッセージ [0] に異なるメッセージを割り当てることができました。また、メッセージ配列は最終的な setText メソッドですが、配列ではなく文字列を要求しています。ここで何かを見逃したので、これを理解するのを妨げていると思います。

4

2 に答える 2

3

いいえ、何も見逃していません。である必要messageがありfinalます。message[0]しませんし、ありません。

于 2012-12-03T15:21:25.923 に答える
0

final内部クラスでのnon-thing へのアクセスに関する制限は、ローカル変数にのみ適用されます。

アクセスできるインスタンスの非finalフィールドまたは配列要素にアクセスすることに問題はありません。

于 2012-12-03T15:21:02.920 に答える