如何仅允许在同一个包中实现接口

Dav*_*Far 4 java visibility interface multiple-inheritance package

我有一个包P

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

现在我想禁止I外部的实现P,但I应该是公开的,因为我用它来做public method(I parameter).

如何才能做到这一点?

这有什么"包装最终模式"吗?

你有这样的情况吗?


细节:

我所知道的使用只包私有构造函数,而不是接口的抽象类的可能性I,但S1S2扩展不同的类,所以我需要多重继承(因为模拟多重继承(例如见有效的Java项目18)不在这里工作了).

LuG*_*uGo 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 {}
Run Code Online (Sandbox Code Playgroud)

多亏了这一点,只有当前包中的类才能实现接口I.来自外部的所有类将永远无法实现该方法Dummy getDummy().同时,包外部的类将能够使用接口I中没有Dummy签名接口的所有其他方法.

这个解决方案并不漂亮,因为你的界面中有一个无用的方法I,但你应该能够达到你想要的效果.

  • +1 Nice解决方案!开箱即用的方式. (3认同)