インターフェイスに含まれるものについて読んでいますが、通常のものに加えて、内部クラスや他のインターフェイスも含めることができることを理解しています。
誰もがインターフェースをインターフェース内に配置したい理由または目的を説明できますか。また、なぜ誰かが内部クラスを内部に入れるのでしょうか。私はネットを調べましたが、標準の Java クラスの 1 つを指すリンク以外に適切な説明が見つかりませんでした。理解を助けるために本当に必要なのは、簡単な例です。
インターフェイスに含まれるものについて読んでいますが、通常のものに加えて、内部クラスや他のインターフェイスも含めることができることを理解しています。
誰もがインターフェースをインターフェース内に配置したい理由または目的を説明できますか。また、なぜ誰かが内部クラスを内部に入れるのでしょうか。私はネットを調べましたが、標準の Java クラスの 1 つを指すリンク以外に適切な説明が見つかりませんでした。理解を助けるために本当に必要なのは、簡単な例です。
これは、内部クラスを使用する私のインターフェイスからの抜粋です。
public interface EmailService {
void send(EmailDetails details);
class EmailDetails {
private String from;
private List<String> to = Lists.newArrayList();
private String messageTemplate;
//...
}
}
要点は、インターフェイスに追加の定義が必要だということです (この場合、メソッドが受け入れるパラメーター)。内部インターフェースでも同じです。
別のクラス/インターフェイスにすることもできましたが、このインターフェイスにのみ関連するため、そこに配置しました。
1つの特定のクラスまたはインターフェースにのみ関連するもので名前空間を汚染することはありません。
ただし、内部クラス(静的でない場合)は、含まれているクラスのインスタンスへの非表示のリンクが含まれているため、内部インターフェイスよりもはるかに関連性があります。したがって、内部クラスのインスタンスは常に外部クラスのインスタンスに暗黙的にバインドされます。
class OuterClass {
int someField;
class InnerClass {
void doSomething () {
someField += 1; // you can access someField from here
}
};
void methodUsingInnerClass () {
InnerClass obj = new InnerClass (); // obj knows to which instance of OuterClass it belongs
someField = 0;
obj.doSomething ();
// now someField == 1
}
};
これは、匿名クラス(定義上は内部クラス)と組み合わせて使用されることが多く、たとえばイベントハンドラーを提供するために使用されます。
強いComposition
関係を築くために、私たちはinner classes
.
編集:
heart
人の対象が構築されると同時に心の対象が構築されるとき、人はそうである。Heart
オブジェクトスコープは人間の体の外では意味がないので、クラスはクラスのクラスでHeart
なければなりません。inner
Man
Java には多重継承がないため、内部クラスは非常に便利です。例えば:
class Vehicle{
}
class Transporter{
}
//you cant create class like this
//class Car extends Vehicle, Transporter {}
//but you can create something like that
class Car extends Vehicle{
class InnerTransporter extends Transporter{}
}
これは完璧な例ではありません (なぜTransporter
Vehicle を拡張しないのですか?) が、アイデアが得られたことを願っています。
そして、内部インターフェースはどうですか。例えば
class View{
public static interface OnClickListener{ //this interface associated with View, so it's more readable
public void onClick();
}
}
それは以前に取り組まれており、その正当な理由の 1 つを引用させてください。
内部インターフェースを使用する正当な理由の 1 つは、その機能が、それが属するクラス [またはインターフェース] に直接関連している場合です。これの良い例は、リスナーです。クラス [またはインターフェイス] Foo があり、他のクラス [またはインターフェイス] がそのイベントをリッスンできるようにしたい場合は、FooListener という名前のインターフェイスを宣言できます。内部インターフェースを作成し、それらの他のクラス [インターフェース] に Foo.Listener を実装させる
サンプル:
http://docs.oracle.com/javase/7/docs/api/java/util/Map.html
http://docs.oracle.com/javase/7/docs/api/java/util/Map.Entry.html
エントリ インターフェイスは Map と非常に密接に関連しているため、API 設計者は Entry をトップ レベル インターフェイスではなく Map の内部インターフェイスにすることにしたと思います。
ただし、実際には、内部インターフェイスは規則というよりはむしろ例外です。