如何使类的成员只能在任何包的子类中访问?
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 坏主意以上是关于如何使类的成员只能在任何包的子类中访问?的主要内容,如果未能解决你的问题,请参考以下文章