Java包和类

时间:2012-10-17 22:15:15

标签: java jar encapsulation

我在Java中构建一个非常简单的库,它将打包在一个Jar中。它应该只暴露一个类:世界。 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类,而不是其他类?

2 个答案:

答案 0 :(得分:3)

如果这是封装的问题,并且您想要向世界公开的所有内容都是“World”类,那么未曝光的类是否位于同一个包中或者它们是否是内部类中并不重要相同的包裹。

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

答案 1 :(得分:1)

制作课程public但是他们的构造函数protected

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

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