5

我正在用 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 类,而不是其他类?

4

2 回答 2

3

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

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

于 2012-10-17T22:21:58.850 回答
1

制作类public,但它们的构造函数protected

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

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

于 2012-10-17T22:19:25.827 回答