4

私はパッケージを持っていPます

  • public interface I
  • public class S1 extends Foo implements I
  • public class S2 extends Bar implements I

I今、私はの外部の実装を禁止したいのですPI、私はそれをに使用しているので、公開する必要がありますpublic method(I parameter)

これはどのように行うことができますか?

このための「パッケージ最終パターン」はありますか?

あなたはそのような状況にあったことがありますか?


詳細:

インターフェイスの代わりにパッケージプライベートコンストラクタのみで抽象クラスを使用する可能性を認識していますIが、異なるクラスS1S2拡張するため、多重継承が必要になります(シミュレートされた多重継承(たとえば、Effective Javaアイテム18を参照)はここでは機能しません) )。

4

3 に答える 3

8

次の試みを試すこともできます。

ダミーパッケージのプライベートインターフェイスを使用し、それを返すメソッドをパブリックインターフェイスに作成します。このような:

public interface I {
  Dummy getDummy(); // this can only be used and implemented inside of the 
                    // current package, because Dummy is package private
  String methodToUseOutsideOfPackage();
}

interface Dummy {}

このおかげで、現在のパッケージのクラスのみがインターフェイスを実装できますI。外部からのすべてのクラスがメソッドを実装することはできませんDummy getDummy()。同時に、パッケージの外部からのクラスは、署名Iにインターフェースがないインターフェースの他のすべてのメソッドを使用できるようになります。Dummy

インターフェイスに役に立たないメソッドが1つあるため、このソリューションは美しくありませんIが、目的を達成できるはずです。

于 2012-10-26T18:10:47.283 に答える
4

できません。あなたのインターフェースがそうなら、publicそれは誰でも実装することができます。2つの実装で抽象クラスを拡張し、現在拡張しているものをカプセル化することは可能ですか?

より良い質問は、本当にこのルールを適用する必要があるかどうかです。インターフェイスのポイントは、インターフェイスを受け入れて実装できるようにする必要があるということです。本当に必要な場合は、インスタンスのクラスが許可されている2つのうちのいずれかであることを確認することで、インターフェイスの使用時に検証を行うことができます。

于 2012-10-26T16:38:58.753 に答える
0

インターフェイスを削除する場合

interface I

パッケージとクラスからのみアクセスできるようにする必要があります

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

于 2012-10-26T16:39:06.347 に答える