2011-01-01 8 views
11

設計時にプライベートインターフェイスが使用されていますか?もしそうなら、理由は何ですか?また、プライベートインターフェイスの必要性はいつ知っていますか?デザインの決定:インターフェイスをプライベートにする理由と時期

+0

インターフェイスが特定のパッケージに含まれていないすべてのコードから抽象化されなければならないものについては? – thejh

+3

インターフェイスは、ネストされたインターフェイスの場合はプライベートにすることができます。トップレベルのクラスまたはインタフェースは、publicまたはpackage-privateのいずれかです。 – Mot

答えて

3

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

しかし、私はしばしば一般用と内部用の2つのインタフェースを持っています。内部使用インタフェースIは、できるだけパッケージをローカルにする。

public interface MyInterface { 
    public void publicMethod(); 
} 

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

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

+2

あなたは内部使用パッケージが必要な理由は何ですか? 10年以上のJavaの経験で、私はこのパターンについては決して来ませんでしたが、あなたはそれを頻繁に**使用すると言います。 – Mot

+2

私は多くの場合、他の開発者が使用しているライブラリやフレームワークを書いています。私はできるだけシンプルなインターフェイスを保つために、私は離れて私はespを離れて隠すことができる任意のメソッド。それらが他の開発者によって使用されることを意図していない場合。 –

1

インターフェイスが内部使用の場合は、パッケージ保護が必要です。 一般的に、インターフェイスの外側に関心がない場合は、インターフェイスのユーザーにとって複雑さが軽減され、より簡単にリファクタリングすることができるため、APIの設計上の決定はto hide itです。 APIを失うと自由を変えることができます。

4

トップレベルインターフェイスはプライベートにすることはできません。それはpublicまたはパッケージへのアクセス権しか持てません。 Java Language Specification, section 9.1.1: "Interface Modifiers"から:のみが宣言直接クラス宣言によって囲まれているメンバーインターフェイスに関する

アクセス修飾子保護およびプライベート(§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 { ... } 

    ... 
} 
+0

私はあなたの2番目の例が好きです。 –

+0

@JordanStewart - ありがとう。実際のコードからは非常に単純化された例です。 –

関連する問題