【问题标题】:Java packages and classesJava 包和类
【发布时间】:2012-10-17 22:15:15
【问题描述】:

我正在用 Java 构建一个非常简单的库,它将打包在一个 Jar 中。它应该只暴露一个类:World。 World 类使用 Block 类的子类,在同一个包中(com.yannbane.a),本身并没有提供很多功能,但需要扩展。我计划创建另一个包,com.yannbane.a.blocks,它将包含所有块类型(子类)。

因此,目录/包结构应如下所示:

com/
    yannbane/
        a/
            World.java
            Block.java

            blocks/
                Brick.java
                Stone.java

但是,为了让 Block 的子类真正扩展 Block 类,我需要创建 Block 类public。这破坏了我让 Jar 文件只公开一个类 World 的目标。我还需要公开子类,以便世界可以使用它们。

我怎样才能保留这个包和目录结构,但仍然让我的 Jar 只公开 World 类,而不公开其他类?

【问题讨论】:

  • 为什么您需要公开子类?不清楚……
  • 你可以让 Block 成为 World 的内部类,它是私有的并且不能从外部访问吗?
  • 如果您打算公开的只是 World 类,为什么其他类的位置很重要。它们也可能位于同一个包中,并且您不会遇到此类问题。你不觉得吗?
  • @EdwinDalorzo,我确实认为,是的,这将是我的问题的解决方案之一。但是,我认为使用逻辑目录结构是首选,所以我想把它做好。
  • @foampile - 如果BlockWorldprivate 内部类,则它不能被World 之外定义的任何类型扩展。

标签: java jar encapsulation


【解决方案1】:

如果这是一个封装问题,并且您想要向世界公开的只是“世界”类,那么未公开的类是否位于同一个包中或者它们是否是内部类都无关紧要同一个包。

无论如何,您的 API 用户将无法访问它们。我相信封装在这里比你想给你的文件的“逻辑”组织更重要。因为如果您将所有类都放在同一个包中,那么您将不会遇到这些问题,并且您将达到您所寻求的封装级别。也许 Java 告诉您的是,这些类具有内在的相关性,您应该将它们全部放在同一个包中。

【讨论】:

    【解决方案2】:

    将类设为public,但将其构造函数设为protected

    您仍然在技术上公开类 - 其他包知道它们 - 但没有其他包可以实例化这些对象。

    即使Block 子类与Blockcom.yannbane.acom.yannbane.blocks)在不同的包中,它们也将能够调用受保护的父构造函数,因为protected 成员可以从同一个包中访问或来自继承对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-24
      • 2011-12-13
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 2010-10-22
      相关资源
      最近更新 更多