使受包保护的 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 中,为啥可以从同一个包中的类外部访问受保护的成员? [复制]