2017-10-12 5 views
2

この問題はに関連している(しかしによって重複しない)Why does compilation of public APIs leaking internal types not fail?エクスポートされたAPIで内部メソッドを宣言するにはどうすればよいですか?

がどのように1は、内部クラスからのみアクセス可能な列挙型のメソッドを定義することができますか?

は、具体的に:

  • ユーザーがAPIの他の部分にenum値を渡すことができるようにする必要があります。
  • ユーザーが渡した値enumに応じて、内部クラスは異なる操作を呼び出す必要があります。
  • enumの値が操作にマップされるように、enumにメソッドを宣言します。

含意:

  • enumpublicとエクスポートする必要があります。
  • 内部クラスは、エクスポートされないように、enumとは別のパッケージに存在する必要があります。
  • enumメソッドは、内部クラスが呼び出すためにはpublicである必要があります。私はpublicメソッドを呼び出すことからユーザーを防ぐことを考えることができ

唯一の方法は、それが非エクスポート型を参照しています。例えば:私はそれを行うとき

public enum Color 
{ 
    RED 
    { 
    public void operation(NotExported ignore) 
    { 
     // ... 
    } 
    }, 
    GREEN, 
    { 
    public void operation(NotExported ignore) 
    { 
     // ... 
    } 
    }, 
    BLUE; 
    { 
    public void operation(NotExported ignore) 
    { 
     // ... 
    } 
    }; 

    /** 
    * Carries out an internal operation. 
    * 
    * @param ignore prevent users from invoking this method 
    */ 
    public abstract void operation(NotExported ignore); 
} 

は残念ながら、コンパイラは、エクスポートされたAPIは、非エクスポートタイプを参照すると文句を言い。これを行うより良い方法はありますか?

答えて

0

アランベートマンpointed outshared secret mechanism JDKで使用されています。これにより、内部クラスは、リフレクションの使用に頼ることなくパッケージ間でパッケージ保護されたメソッドを共有できます。

関連する問題