java - 如何只允许在同一个包中实现接口(interface)

标签 java interface package visibility multiple-inheritance

我有一个包 P

  • 公共(public)接口(interface) I
  • public class S1 extends Foo implements I
  • public class S2 extends Bar implements I

现在我想禁止在 P 之外实现 I,但是 I 应该是公开的,因为我将它用于 >公共(public)方法(I 参数)

如何做到这一点?

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

你遇到过这样的情况吗?


详细信息:

我知道使用仅包含包私有(private)构造函数的抽象类而不是接口(interface) I 的可能性,但是 S1S2扩展不同的类,所以我需要多重继承(因为模拟多重继承(参见 Effective Java item 18)在这里不起作用)。

最佳答案

您也可以尝试以下尝试:

使用虚拟包私有(private)接口(interface)并在您的公共(public)接口(interface)中创建一个返回它的方法。像这样:

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()。同时,来自包外部的类将能够使用接口(interface) I 的所有其他方法,它们的签名中没有 Dummy 接口(interface)。

这个解决方案并不漂亮,因为您的接口(interface) I 中有一个无用的方法,但您应该能够实现您想要的。

关于java - 如何只允许在同一个包中实现接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13090906/

相关文章:

java - 是否可以为接口(interface)类型创建对象

java - 在 Java 接口(interface)中声明参数子类型,在 Java 实现方法中使用子类型

android - 卸载在 Android 中不可见的包

oracle - 在包编译中绕过 “table or view does not exist”

java - 使用 servlet 时出现 Netbeans 错误

java - 将正则表达式的 for 循环更改为 while 循环

java - Spark foreachPartition 仅在 master 上运行

java - 当我将 lambda 表达式作为参数传递时,它怎么可能访问此范围内的其他变量?

java - 两个 "like"查询组合并排序

php - 如何在laravel包中给出资源路径?