0

私は公開インターフェースを使用してクラスをリファクタリングしており、使用法について考えると、次のように尋ねました。

いくつかのより大きなクラス内で(インスタンス変数として)以下を宣言することの違いは何ですか?

private final OnClickListener mButtonOnClickListener = new OnClickListener() {
    @Override
    public void onClick(View view) {            
        //some codes
    }
};

vs次のように匿名の内部クラスとして宣言する(オンザフライ):

private void someFunctionInClass() {
    someOtherFunctionThatTakesAnOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {            
            //some codes
        }
    });
}

より具体的には、前者はまだ匿名の内部クラスと見なされますか?私はこの回答で匿名の内部クラスを読んだ

別のクラスのメソッドの本体内で作成および定義されたものです

私が示した最初の例は、別のクラスの本体内で作成および定義されていますが、2番目の例のように別のクラスのメソッド内では定義されていません。それはまだ匿名の内部クラスですか?さらに、一方と他方で受け入れられている慣行は何ですか?新しいオブジェクトを再作成する必要がないため、匿名の内部クラスをインスタンス変数として宣言する方が効率的ですか?

4

5 に答える 5

2

これらは両方とも匿名クラスです。スコープ以外はあまり違いはありません。ただし、以下は、ローカルクラスからどちらを使用するかを決定する際に使用できるリンクです。匿名クラス:ネストされたクラス:ラムダ式: http ://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html

お役に立てば幸いです。

于 2013-03-21T20:19:21.507 に答える
1

これらは両方とも匿名のクラスです。最初のものでは、それを再利用できますが、どちらも作成されたオブジェクトにすぎません。匿名クラスは必然的に内部クラスであり、それを囲むクラスの任意のフィールドにアクセスできます。

匿名クラスが、明確な違いがある内部クラスや静的ネストクラスと混同されている可能性があると思います。

于 2013-03-21T20:14:27.673 に答える
0

どちらも匿名のクラスです。リスナーを例にとると、2つのコンポーネントに同じリスナーを使用する場合は、そのインスタンス変数を使用できます。それ以外の場合は、コンポーネントに直接アタッチできます。したがって、要件によって異なります。

ただし、ほとんどの場合、これは一種の1回限りの使用です。つまり、そのためのインスタンスを作成することは避けます。再利用する場合は、そのための別のクラスを作成することをお勧めします。

于 2013-03-21T20:13:57.387 に答える
0

どちらも匿名のクラスです。匿名クラスは、コンストラクター(new ClassName())とそれに続くクラス本体({...})です。

于 2013-03-21T20:14:19.567 に答える
0

あなたの例では、どちらの場合も匿名の内部クラスを作成しました。「newOnClickListener(){」コンパイル時に解決されるので、オーバーヘッドはないと思います。人々はいつもそれを使います。

于 2013-03-21T20:15:48.310 に答える