3

Javaのインターフェース内に内部クラスを持つことは可能ですか???

4

7 に答える 7

3

あなたはできる。しかし、オライリーはそれについて次のように述べています。

インターフェイスのネストされたクラス?

Java は、インターフェースでネストされたクラスの概念をサポートしています。構文とダイナミクスは、クラスで宣言されたネストされたクラスと同じように機能します。ただし、インターフェイス内にネストされたクラスを宣言することは、非常に悪いプログラミングになります。インターフェイスは概念の抽象化であり、実装ではありません。したがって、実装の詳細はインターフェイスから除外する必要があります。のこぎりで手を切り落とすことができるからといって、それが特に良いアイデアであるとは限りません。


とはいえ、インターフェイスにネストされた静的ユーティリティ クラスの引数を確認できました。ただし、スタンドアロン クラスではなくインターフェイスにネストする必要がある理由は、完全に主観的なものです。

于 2010-08-01T16:32:33.820 に答える
2

これは一般的にまれであることに同意しますが、インターフェイスメソッドが複数の情報を返す必要がある場合は、サービスのインターフェイスで内部クラスを使用するのが好きです。これは、実際には実装ではなく契約の一部であるためです。例えば:

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 つの場所に保持しているように感じます。

于 2010-08-01T18:35:53.960 に答える
1

質問に直接答えることはありませんが、関連するメモで、別のインターフェイス内にインターフェイスをネストすることもできます。これは、特にビューを提供する場合は許容されます。Javaのコレクションクラスはこれを行います。たとえば、ビューMap.javaの場合は次のようになります。Map.Entry

public interface Map<K,V> {
   ...
   public static interface Entry<K,V> {
       ....
   }
}

実装の詳細をインターフェースに混ぜていないので、これは許容できます。別の契約を指定しているだけです。

于 2010-08-01T16:59:24.697 に答える
1

はい、可能ですが、一般的な方法ではありません。

interface Test
{
    class Inner
    { }
}

class TestImpl implements Test
{
    public static void main(String[] arg)
    {
        Inner inner = new Inner();
    }
}
于 2010-08-01T16:30:33.430 に答える
0

私が非常に便利だと思う使用例の 1 つは、Interface のインスタンスを作成するビルダーがある場合です。ビルダーがインターフェイスの静的メンバーである場合、次のようにインスタンスを作成できます。

DigitalObject o = new DigitalObject.Builder(content).title(name).build();
于 2010-08-01T17:11:39.653 に答える
0

はい。言語仕様からまっすぐ:

内部クラスは、明示的または暗黙的に宣言されていないネストされたクラスですstatic

そして(太字の鉱山):

ネストされたクラスとは、別のクラスまたはインターフェイスの本体内で宣言が行われるクラスです。

于 2010-08-01T16:34:22.893 に答える
0

それは合法ですが、ネストされたインターフェース(すでに述べたように)またはネストされた列挙型でのみ実際に行います。例えば:

public interface MyInterface {

    public enum Type { ONE, TWO, THREE }

    public Type getType();

    public enum Status { GOOD, BAD, UNKNOWN }

    public Status getStatus();

}
于 2010-08-01T17:43:47.453 に答える