5

私は Java で非常に単純なライブラリを構築しています。これは単一の Jar にパッケージ化されます。1 つのクラスのみを公開する必要があります: World. World クラスは、同じパッケージ ( com.yannbane.a) にある Block クラスのサブクラスを使用し、それ自体は多くの機能を提供しませんが、拡張する必要があります。com.yannbane.a.blocksすべてのブロック タイプ (サブクラス) を含む別のパッケージ を作成する予定でした。

したがって、ディレクトリ/パッケージ構造は次のようになります。

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

            blocks/
                Brick.java
                Stone.java

ただし、Block のサブクラスが実際に Block クラスを拡張するためには、Block クラスを作成する必要がありましたpublic。これは、Jar ファイルで 1 つのクラス 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 に答える