使受包保护的 java 类在父包中可见

Posted

技术标签:

【中文标题】使受包保护的 java 类在父包中可见【英文标题】:Making package-protected java class visible in parent package 【发布时间】:2012-03-05 22:13:30 【问题描述】:

我有两个包

uk.co.planetbeyond.data

uk.co.planetbeyond.data.bean

如何使uk.co.planetbeyond.data.bean 中的类对父包uk.co.planetbeyond.data 中的类可见,但在其他包中不可见?

有可能吗?

【问题讨论】:

我不认为你可以;包层次结构实际上并没有任何父子关系。 简而言之:不。这不是包的工作方式。 【参考方案1】:

据我所知,这是不可能的。虽然我们倾向于认为包形成层次结构,但就 Java 语言而言,它们并非如此。

【讨论】:

【参考方案2】:

简短的回答,除非您的 uk.co.planetbeyond.data.bean 包中的类的子类,否则这是不可能的。

您可能有兴趣阅读:

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

Isn't "package private" member access synonymous with the default (no-modifier) access?

In Java, difference between default, public, protected, and private

Java - Method accessibility inside package-private class?

【讨论】:

【参考方案3】:

不,这是不可能的。包可见性不能选择性地扩展到其他包。一个类只能是私有的(即,仅对非私有的封闭类可见)、包私有(无修饰符,仅对同一包中的其他类可见)或公共(对所有类可见)。

【讨论】:

【参考方案4】:

据我所知,这在 Java 中是不可能的。 有关详细信息,请参阅链接 here,它清楚地解释了 Java 中的访问修饰符。

【讨论】:

【参考方案5】:

目前,这是不可能的。 Java 包本质上并不是真正分层的——类要么在同一个包中,要么不在。

但是,这可能是Project Jigsaw 将解决的问题之一,它可能包含在 Java 8 中。这应该允许创建在模块的所有包中都是公共的类,但不会导出到其他模块。

【讨论】:

对于任何阅读的人(现在一年后,在撰写本文时),Jigsaw 已被推迟到 Java 9。【参考方案6】:

正如所有其他答案所述:不。包层次结构在设置它的人的头脑之外没有任何意义。

在我看来,这是 Java 的主要缺陷。当通过合并其他怪物程序来构建怪物系统时,没有什么比 Java 语言更好的了。所有其他语言最终都会变成一堆混乱、无法记录、无法解读的代码。

嗯,Java 也是如此,但它比我使用过的任何其他语言都走得更远。但它对包层次结构的无知——无法将数据封装在包层次结构中——是阻止它的限制或砖墙。我可以将一个系统或一组协同工作的类放在一个包中。然后我可以将这些类包中的一堆私有化,这样当这个包被添加到另一个超级系统时 超级系统无法看到——并且被那些隐藏的类弄糊涂了。 p>

但是如果我的系统已经足够超级了(“superman”中的“super”,而不是“superclass”)需要几个包以便清楚起见,我以前的包私有类现在必须是公共的,而且我无法阻止超级超级系统看到我超级系统中的所有内容。

要使庞大而复杂的系统工作,必须将每个点的复杂性降到最低。我的超级系统必须看起来与我要添加到的超级超级系统一样简单。将所有的管道、电线、梁和焊缝都公开展示,因为我无法将它们设为包级私有,这无济于事。

我希望其他地方提到的 Jigsaw 会有所帮助。我还希望 IDE 等开发人员工具将开始以大纲格式显示包,而不是将 a.b 和 a.b.c.d.e 视为都在同一级别——只是同一列表中的元素。

【讨论】:

以上是关于使受包保护的 java 类在父包中可见的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在父类的帮助下访问不同包中的受保护变量吗?

超类中的受保护方法在不同包中的子类中是不是可见? [复制]

在 Java 中,为啥可以从同一个包中的类外部访问受保护的成员? [复制]

Java - 为啥另一个包中的子级无法通过父级引用访问父级的受保护方法?

为啥 Java 允许增加子类中受保护方法的可见性?

继承时无法访问受保护的内部类