16

設計上の決定にプライベート インターフェイスが使用されたことはありますか? もしそうなら、その理由は何ですか? また、プライベート インターフェイスの必要性はいつわかりますか?

4

3 に答える 3

9

最上位インターフェイスをプライベートにすることはできません。publicアクセス権またはパッケージ アクセス権のみを使用できます。Java 言語仕様のセクション 9.1.1: "Interface Modifiers"から:

アクセス修飾子 protected と private は、宣言がクラス宣言によって直接囲まれているメンバー インターフェイスにのみ関係します (§8.5.1)。

ネストされたインターフェイスは、それとそのサブクラス (存在する場合) が最上位クラスprivateの実装の詳細である場合にいつでも可能です。

たとえば、CLibrary以下のネストされたインターフェイスは、最上位クラスの実装の詳細として使用されます。これは純粋に JNA の API を定義するために使用され、インターフェースのClass.

public class ProcessController {
    private interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary( "c", CLibrary.class );
        int getpid();
    }

    public static int getPid() {
        return CLibrary.INSTANCE.getpid();
    }
}

別の例として、このプライベート インターフェイスは、カスタムの書式設定記号を実装するネストされたプライベート クラスによって使用される API を定義します。

public class FooFormatter {
    private interface IFormatPart { 
        /** Formats a part of Foo, or text.
         * @param foo Non-null foo object, which may be used as input.
         */
        void write( Foo foo ) throws IOException;
    }

    private class FormatSymbol implements IFormatPart { ... }

    private class FormatText implements IFormatPart { ... }

    ...
 }
于 2015-10-28T18:42:33.597 に答える
3

IMHOインターフェイスをプライベートにすることはできません。

ただし、私は2つのインターフェイスを持っていることがよくあります。1つはパブリック用で、もう1つは内部用です。可能であればパッケージをローカルにする内部使用インターフェース

public interface MyInterface {
   public void publicMethod();
}

interface DirectMyInterface extends MyInterface {
   public void internalUseOnlyMethod();
}

内部使用メソッドは、他の開発者に使用させたくないメソッドや、簡単に変更できるようにしたいメソッドを公開します。私がインターフェースを持っている理由は、インターフェースを介して内部的に使用したいいくつかの実装があるからです。

于 2011-01-01T10:05:32.270 に答える
1

内部で使用する場合は、インターフェイスをパッケージで保護する必要があります。一般に、インターフェースの範囲外に関心がない場合は、インターフェースのユーザーの複雑さが軽減され、インターフェースがパブリックであり APIを変更する自由を失います。

于 2011-01-01T10:12:31.850 に答える