4

我有一个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).

如何才能做到这一点?

是否有一些“包装最终模式”?

你有过这样的情况吗?


细节:

我知道使用仅包私有构造函数而不是 interface 的抽象类的可能性I,但是S1S2扩展不同的类,所以我需要多重继承(因为模拟多重继承(参见例如 Effective Java item 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 {}

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

这个解决方案并不漂亮,因为你的界面中有一个无用的方法I,但你应该能够实现你想要的。

于 2012-10-26T18:10:47.283 回答
4

做不到。如果你的接口是public它可以由任何人实现。您的两个实现是否可以扩展一个抽象类并封装它们当前正在扩展的那些?

更好的问题是你真的需要执行这条规则吗?接口的重点是您应该能够接受和实现该接口。如果您确实需要,您可以在使用接口时通过检查实例的类是否是您允许的两个类之一来进行验证。

于 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 回答