Javaのインターフェース内に内部クラスを持つことは可能ですか???
7 に答える
あなたはできる。しかし、オライリーはそれについて次のように述べています。
インターフェイスのネストされたクラス?
Java は、インターフェースでネストされたクラスの概念をサポートしています。構文とダイナミクスは、クラスで宣言されたネストされたクラスと同じように機能します。ただし、インターフェイス内にネストされたクラスを宣言することは、非常に悪いプログラミングになります。インターフェイスは概念の抽象化であり、実装ではありません。したがって、実装の詳細はインターフェイスから除外する必要があります。のこぎりで手を切り落とすことができるからといって、それが特に良いアイデアであるとは限りません。
とはいえ、インターフェイスにネストされた静的ユーティリティ クラスの引数を確認できました。ただし、スタンドアロン クラスではなくインターフェイスにネストする必要がある理由は、完全に主観的なものです。
これは一般的にまれであることに同意しますが、インターフェイスメソッドが複数の情報を返す必要がある場合は、サービスのインターフェイスで内部クラスを使用するのが好きです。これは、実際には実装ではなく契約の一部であるためです。例えば:
public interface ComplexOperationService {
ComplexOperationResponse doComplexOperation( String param1, Object param2 );
public static class ComplexOperationResponse {
public int completionCode;
public String completionMessage;
public List<Object> data;
// Or use private members & getters if you like...
}
}
明らかに、これは別のクラスでも実行できますが、私には、インターフェイスによって定義された API 全体を分散させるのではなく、1 つの場所に保持しているように感じます。
質問に直接答えることはありませんが、関連するメモで、別のインターフェイス内にインターフェイスをネストすることもできます。これは、特にビューを提供する場合は許容されます。Javaのコレクションクラスはこれを行います。たとえば、ビューMap.java
の場合は次のようになります。Map.Entry
public interface Map<K,V> {
...
public static interface Entry<K,V> {
....
}
}
実装の詳細をインターフェースに混ぜていないので、これは許容できます。別の契約を指定しているだけです。
はい、可能ですが、一般的な方法ではありません。
interface Test
{
class Inner
{ }
}
class TestImpl implements Test
{
public static void main(String[] arg)
{
Inner inner = new Inner();
}
}
私が非常に便利だと思う使用例の 1 つは、Interface のインスタンスを作成するビルダーがある場合です。ビルダーがインターフェイスの静的メンバーである場合、次のようにインスタンスを作成できます。
DigitalObject o = new DigitalObject.Builder(content).title(name).build();
それは合法ですが、ネストされたインターフェース(すでに述べたように)またはネストされた列挙型でのみ実際に行います。例えば:
public interface MyInterface {
public enum Type { ONE, TWO, THREE }
public Type getType();
public enum Status { GOOD, BAD, UNKNOWN }
public Status getStatus();
}