4

私はAndroidを初めて使用します。私は、インターフェイスがクラスの機能を強化する方法を提供する基本的なオブジェクト指向プログラミングコースで勉強しました。この方法で実際に機能を強化し、それらのインターフェースを実装し、インターフェースで記述されたすべてのメソッドをオーバーライドするクラス。

次のコードはAndroidで同じ仕事をします:

public class MyActivity extends Activity implements OnClickListener {
   // All other code you may expect

   myButton.setOnClickListener(this);

   @override
   public onClick(View view) {
      // Code when view is clicked
   }
} 

このコードは理解できます。しかし、次のコードは私には意味がありません。さまざまな場所で検索しましたが、満足のいく答えは得られませんでした。

public class MyActivity extends Activity {
   // All other code you may expect

   myButton.setOnClickListener(new OnClickListner() {

      @override
      public onClick(View view) {
         // Code when view is clicked
      }
  });
}

これOnClickListener()は、Androidのドキュメントに記載されているインターフェースであり、インターフェースをインスタンス化しています。インターフェイスだけが実装されていませんか?この点を理解するのを手伝ってください。

4

4 に答える 4

12

new OnClickListner() {インターフェイスをインスタンス化するのではなく、 匿名の内部クラスを宣言します。基本的には、名前自体を持たない匿名クラス(インターフェイスOnClickListnerを実装するクラス)です。

ドキュメントから:

匿名クラス式は、次のもので構成されます。

  • 新しいオペレーター
  • 実装するインターフェースまたは拡張するクラスの名前。この例では、匿名クラスがインターフェースOnClickListnerを実装しています。
  • 通常のクラスインスタンス作成式と同様に、コンストラクターへの引数を含む括弧。注:インターフェースを実装する場合、コンストラクターがないため、この例のように、空の括弧のペアを使用します。
  • クラス宣言本体である本体。より具体的には、本文では、メソッド宣言は許可されていますが、ステートメントは許可されていません。
于 2013-03-26T15:52:48.907 に答える
1

これらのOnClickListenersは匿名クラスです。括弧にはクラス定義が含まれます。

于 2013-03-26T15:53:39.397 に答える
1

インターフェイスでnewを使用する場合は、インターフェイスを実装するが独自の名前を持たない匿名の内部クラス{ }を作成するときに、ブロック内のインターフェイスによって提供されるメソッドをオーバーライドする必要があります。

これにより、たとえば、ボタンごとにOnClickListnerを実装するクラスを作成しなくても、複数の異なるクリックハンドラーを使用できます。

于 2013-03-26T15:57:04.340 に答える
1

実際、これは、Javaだけでなく、OOPでこれまでに見た中で最悪のプラクティスの1つです。

基本的に、から匿名の内部クラスInterfaceを作成し、インターフェイスが提供するすべてのメソッドをすぐに実装する必要があります。この場合のインターフェースは、抽象クラスのように考えてください(基本的には、多かれ少なかれ常にそうです)。

javaは広く普及しており、一部の言語で適切にサポートされていますが、言語レベルでの内部クラスの概念のみをサポートしています。ただし、バイトコードレベルでは、内部クラスはありません。コンパイラーは、これらの内部クラス言語構造を親クラスからリッピングし、$記号と連続番号を使用してそれらを兄弟として配置し、プライベートスコープ要素(メソッド、変数)をパッケージスコープに昇格させます。それを少しの間沈め、セキュリティへの影響についても考えてみましょう。

次に、これらの匿名の内部クラスは、Androidコンテキストでのように過度に使用されており(元の質問はAndroidとタグ付けされていました)、コードが完全に乱雑になり、完全に判読できなくなります。これはクリーンなコードとはほど遠いものであり、読みやすく保守しやすいコードを維持するために従うことを強くお勧めします。

もう1つは、すべてがnew Interface() { ... };自然に新しいオブジェクトを作成することです。通常、これはAndroidの世界のリスナーで見られます。あなた自身とあなたのユーザーにいくらかのメモリを節約し、複数のリスナーがいる場合はスイッチで1つのオブジェクトを実装してください... Googleの例がそれを行うという理由だけで、そしてここで答えるときに彼らの例でそれを行う人がいるという理由だけで、毎回新しいオブジェクトを作成しないでくださいSOやチュートリアルやフォーラムで。:)

于 2015-02-24T06:19:23.437 に答える