Java包和类

Java包和类,java,jar,encapsulation,Java,Jar,Encapsulation,我正在用Java构建一个非常简单的库,它将打包在一个Jar中。它应该只公开一个类:世界。World类使用Block类的子类,Block类在同一个包(com.yannbane.a)中,它本身不提供很多功能,但需要扩展。我计划创建另一个包,com.yannbane.a.blocks,它将包含所有的块类型(子类) 因此,目录/包结构应如下所示: com/ yannbane/ a/ World.java Block.java

我正在用Java构建一个非常简单的库,它将打包在一个Jar中。它应该只公开一个类:世界。World类使用Block类的子类,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只公开世界级,而不公开其他类?

使类
公开
,但它们的构造函数
受保护

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


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

如果这是一个封装问题,并且您想要向世界公开的只是“world”类,那么未公开的类是否位于同一个包中或者是否是同一个包中的内部类并不重要


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

为什么需要将子类公开?这还不清楚…你能让Block成为一个对世界来说是私有的、不能从外部访问的内部类吗?如果你想要公开的只是世界类,那么为什么其他类位于何处很重要呢。它们也可能位于同一个包中,您不会遇到此类问题。“你不认为吗?”埃德温达洛佐,我确实认为,是的,这将是解决我问题的办法之一。但是,我认为使用逻辑目录结构是首选,所以我想正确地执行它。@foampile-如果
世界
私有
内部类,那么它不能被
世界
之外定义的任何类型扩展。