当前位置: 首页 > 知识库问答 >
问题:

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

施令秋
2023-03-14

我有一个包裹P

  • 公共界面I

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

如何做到这一点?

这有什么“套餐最终模式”吗?

你有过这样的情况吗?

详情:

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

共有3个答案

冯元徽
2023-03-14

如果你做了界面delcaration

interface I

它应该使它只能从包和类中访问

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

东方旺
2023-03-14

不行。如果你的界面是公开的,任何人都可以实现。您的两个实现是否可以扩展一个抽象类并封装它们当前扩展的类?

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

公西翼
2023-03-14

您也可以尝试以下尝试:

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

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接口。

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

 类似资料:
  • 问题内容: 我想使我的网站一次只允许一个会话。例如,假设用户已经登录到我在firefox上的网站,如果该用户再次登录到另一台浏览器(例如同一台计算机或另一台计算机上的Opera),则Firefox上的会话将被破坏。但是,如果仍为一届会议,则有关Firefox的会议仍将保留。我可以知道该怎么做吗?我正在使用php和apache。谢谢。 问候。本杰明 问题答案: 我建议您做这样的事情: 假设用户“ A

  • 问题内容: 我需要防止用户多次启动我的Java应用程序(WebStart Swing应用程序)。因此,如果应用程序已经在运行,则应该无法再次启动它或显示警告/再次关闭它。 有一些方便的方法可以做到这一点吗?我考虑过要阻止端口或将某物写入文件。但是希望您可以访问某些系统属性或JVM? 顺便说一句 目标平台是带有Java 1.5的Windows XP 问题答案: 我认为您的建议是在启动应用程序时打开端

  • 为了Android的开发,我从Java切换到kotlin。当我在Kotlin中搜索Java静态方法的等价时,我发现同伴对象是。但问题是在Kotlin中创建多个静态方法时。我得到了这些错误,每个类只允许一个伴随对象。

  • #include <stdio.h> #include <pthread.h> int a = 0; int b = 0; void *thread1_func(void *p_arg) { while (1) { a++; sleep(1); } } void *thread2_fu

  • 问题内容: 这是django模板的一部分,它应该做的是打印出几个单选按钮,对应于分配给按钮的答案。但是我不知道为什么我可以检查多个单选按钮,这让我很困惑。它应该只允许我检查一个单选按钮,但是我以某种方式拥有它,但是我却丢失了它。有什么帮助吗?谢谢。 问题答案: 只需给他们起相同的名字:

  • 我只是在我的服务器上实现了一个简单的Websocket系统。我试图测试最大连接数,我做了以下代码: 每次我运行它时,前200个用户会被连接,之后,所有请求都被调用onclose()。在web控制台中,我得到以下错误: Mozilla:加载页面时,与ws://localhost:8080/myapp/websocket的连接中断 Chrome:WebSocket握手时出错:“Connection”标