0

かなり基本的なサービスを考えてみましょう。

class KeepANumberService extends Service {
    // The codes used in incoming messages
    final static int REQUEST_SET_NUMBER = 0;
    final static int REQUEST_GET_NUMBER = 1;

    // The information this service works with internally
    int numberToKeep = 0;

    // The handler for incoming messages
    private IncomingMessageHandler incomingMessageHandler = new IncomingMessageHandler();

    // Start up and close down stuff
    < Insert standard start up and close down code OnCreate, OnBind etc etc here >

    void returnNumber(Messenger destination) {
         Message msg = <construct message with numberTo>;
         destination.send(msg);
    }

    // Handler that receives messages from the thread
    private class IncomingMessageHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case REQUEST_SET_NUMBER:
                numberToKeep = msg.whatever; // get data from wherever it's hidden in the msg
                break;
            case REQUEST_GET_NUMBER:
                returnNumber(msg.replyTo);
                break;
            } 
          }
      }
  }

}

さて、lintを実行してEclipseでこれを開発している場合、現在2つのオプションから選択できます。

  1. 上記のコードでは、プライベート最終クラスのIncomingMessageHandler行に警告が表示され、実行時にすべてが機能するように、静的としてデカラリングする必要があることが示されます。
  2. そのクラス(IncomingMessageHandler)を静的にすると、クラス全体(KeepANumberService)のデータと関数にアクセスできなくなります。これは、コーディングが面倒です(場合によっては不可能ですか?)。

では、メッセージハンドラーを静的にすることはどれほど重要ですか?なぜ?

4

1 に答える 1

1

キーワードstaticは、内部クラス定義で使用される場合、内部クラスが外部クラスへの参照を必要としないことを示します。通常、内部クラスが「データコンテナ」である場合にこれを行います(「structC」と考えてください)。あなたの場合、内部クラスはデータコンテナではなく、メソッドを持ち、外部クラスのメンバー変数へのアクセスを必要とする単なるプライベート内部クラスです。したがって、このクラスを静的と宣言する理由はまったくありません。それは逆効果になります。

あなたのコードを見ると、なぜこのクラスを静的と宣言する警告が表示されるのかわかりません。無視してください。

于 2012-09-22T09:28:59.980 に答える