設計上の決定にプライベート インターフェイスが使用されたことはありますか? もしそうなら、その理由は何ですか? また、プライベート インターフェイスの必要性はいつわかりますか?
3 に答える
最上位インターフェイスをプライベートにすることはできません。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 { ... }
...
}
IMHOインターフェイスをプライベートにすることはできません。
ただし、私は2つのインターフェイスを持っていることがよくあります。1つはパブリック用で、もう1つは内部用です。可能であればパッケージをローカルにする内部使用インターフェース
public interface MyInterface {
public void publicMethod();
}
interface DirectMyInterface extends MyInterface {
public void internalUseOnlyMethod();
}
内部使用メソッドは、他の開発者に使用させたくないメソッドや、簡単に変更できるようにしたいメソッドを公開します。私がインターフェースを持っている理由は、インターフェースを介して内部的に使用したいいくつかの実装があるからです。
内部で使用する場合は、インターフェイスをパッケージで保護する必要があります。一般に、インターフェースの範囲外に関心がない場合は、インターフェースのユーザーの複雑さが軽減され、インターフェースがパブリックであり、 APIを変更する自由を失います。