如何使类的成员只能在任何包的子类中访问?

Posted

技术标签:

【中文标题】如何使类的成员只能在任何包的子类中访问?【英文标题】:How to make a member of a class to be accessible only in subclasses in any packages? 【发布时间】:2017-11-29 09:26:34 【问题描述】:

Protected 不是解决方案,因为它会将成员开放给其他非子类。

【问题讨论】:

多么奇怪的要求。你到底为什么要这样做? 也看看这个问题:***.com/questions/41431533/… 之前有人问过关于受保护修饰符的类似问题。我现在找不到它,但一般的要点是你应该控制包,因为你正在编写程序,所以包的可见性不应该成为问题。本质上,只有您选择放入包中的类才能访问这些字段和方法,因此您可以通过不将其他类放入同一个包中来使它们仅对子类可见。 @Arc676 以后的任何人都可以在任何包中定义一个类。这不是正常的形式,但这是允许的。只是为了验证,我只是在java.lang 中创建了一个测试类,它编译没有问题。 @Brick 我不知道这个选项。这也适用于导出为 JAR 的程序吗? 【参考方案1】:

Java 不提供绝对封装。程序员——无论是原始设计者还是使用已发布 API 的任何人——都需要一定程度的纪律,以遵守语言之外的一些规则。关于会员访问,您已经确定了一种此类情况。你想要的东西在 Java 中是不可能的。

从更广泛的角度来看,我要指出,如果程序员愿意走得足够远,即使是 private 成员也可以被其他类访问。通过 JNI 进行的调用不必尊重任何访问修饰符。参见,例如,Can a native method call a private method?

语言外规范的其他示例包括 equals/hashCode 的合同,必须满足该合同才能使类在集合方面表现良好,但不在语言级别强制执行。

【讨论】:

【参考方案2】:

我明白你为什么要这样做;然而,Java 根本不提供这种能力。

【讨论】:

【参考方案3】:

你可以用protected 成员做抽象类,并在另一个包中实现它。考虑您为某些事物创建了一些库和设计可扩展性。您的 lib 的后续用户将实现您的类的实现,并可以访问受保护的成员,同时无法在您的包中创建实现类。在示例 FilterReader 类中,它为可扩展性而设计,在您在 java.io 包之外的代码中的某处实现它之后,受保护的字段和方法将对您包中的其他类私有。

【讨论】:

【参考方案4】:

在访问控制期间,您试图实现的目标是不可能的:

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

您可能会重新考虑您的软件设计,因为您的问题是由架构引起的。 请在您的问题中更具体,以获得进一步的答案。

解决您的问题可能会产生副作用,而且不是OOD方式。

访问私有成员的唯一方法是使用具有相同可见性问题的 getter 方法。

【讨论】:

***.com/questions/21016776/… java反射API怎么样? @harshavmb 坏主意

以上是关于如何使类的成员只能在任何包的子类中访问?的主要内容,如果未能解决你的问题,请参考以下文章

C ++:使类及其某些数据成员仅在命名空间中可用

JavaOO05

继承多态

子类如何访问父类

类和接口

使类和成员的可访问性最小化