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

我有两个包

uk.co.planetbeyond.data

uk.co.planetbeyond.data.bean

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

有可能吗?

【问题讨论】:

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

标签: java


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    【解决方案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 视为都在同一级别——只是同一列表中的元素。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-06
          • 2011-02-01
          • 2012-01-22
          • 2018-05-16
          • 2011-04-02
          • 2018-05-27
          相关资源
          最近更新 更多