web-dev-qa-db-ja.com

Javaファイルでパッケージを定義する目的は何ですか?

私は初心者であり、私が言うなら

package my.first.group.here;
...

このパッケージにあるJava=ファイルはmy/first/group/hereディレクトリの下に配置されます。

パッケージにいくつかのJavaファイルを配置する主な目的は何ですか?また、これを採用することを選択した場合、どのようにグループ化する必要がありますか?

ありがとうございました


編集:再び同じ質問があるかもしれない人のために、私はちょうど見つけました パッケージに関するこのチュートリアル Sunから。

47
derrdji

Wikipediaの記事 で説明されている「Javaパッケージ」の定義から始めましょう。

Javaパッケージは、JavaクラスをModulaのモジュールに似た名前空間に編成するためのメカニズムです。 JavaパッケージはJARファイルと呼ばれる圧縮ファイルに保存できるため、クラスは一度に1つではなくグループとしてより速くダウンロードできます。また、プログラマは通常、パッケージを使用して、同じカテゴリに属する​​クラスまたは類似の機能を提供するクラスを編成します。

そのため、Javaのパッケージは、クラスを整理し、クラス名の衝突を防ぐために使用されるメカニズムにすぎません。任意の名前を付けることができますが、Sunはいくつかの 命名規則 を公開していますshouldパッケージの命名時に使用します:

パッケージ

一意のパッケージ名のプレフィックスは常にすべて小文字のASCII文字で記述され、トップレベルのドメイン名の1つである必要があります。現在はcom、edu、gov、mil、net、org、またはISO規格3166、1981で指定されている国を識別する英語の2文字コード。

パッケージ名の後続のコンポーネントは、組織の内部命名規則によって異なります。このような規則では、特定のディレクトリ名コンポーネントが部門名、部門名、プロジェクト名、マシン名、またはログイン名であることを指定する場合があります。

例:

  • com.Sun.eng

  • com.Apple.quicktime.v2

  • edu.cmu.cs.bovik.cheese

41
William Brendel

大規模なアプリケーションの場合、特にサードパーティのjarを取り込む場合は、まったく同じ名前の2つのファイル(Java.util.DateとJava.sql.Date)が必要です。基本的に、パッケージを使用して一意性を確保できます。

最も重要なことは、私の意見では、パッケージングは​​プロジェクトを意味のあるセグメントに分解します。したがって、私のSQLパッケージにはsql関連のコードがあり、ロガーパッケージはロギングを処理します。

14
geowa4

複数の異なるプログラム/コンポーネント/ライブラリからプログラムを構成できるため、クラス名が競合せず、コンポーネントを整理しやすくなります。 http://Java.Sun.com/docs/books/tutorial/Java/package/index.html を参照してください

Javaでは、通常、パッケージに逆ドメイン名として名前を付けます。たとえば、会社のドメインが「initech.com」で、「Gizmo」というプログラムを作成している場合、パッケージ名は通常「com.initech.gizmo」という接頭辞が付いており、プログラムのさまざまなコンポーネントのサブパッケージが付いています。

4
Esko Luontola

他の回答で言及されている名前空間に加えて、そのメンバーで宣言されたスコープに基づいてメソッドとフィールドへのアクセスを制限できます。 publicスコープを持つメンバーは自由にアクセスできます。アクセスを制限するには、通常private(つまり、クラスの外部に隠されている)として定義します。 protectedスコープを使用して、型とその子へのアクセスを制限することもできます。また、defaultスコープ(修飾子のないメンバーにはデフォルトのスコープがあります)があり、子タイプと同じパッケージ内のタイプがメンバーにアクセスできます。これは、フィールドやメソッドをあまり広く利用することなく共有する効果的な方法であり、テストに役立ちます。

たとえば、以下のメソッドは同じパッケージの他のすべてのメンバーに表示されます。

public class Foo {
    int doSomething() {
        return 1;
    }
}

メソッドをテストするために、同じパッケージに別のタイプを定義できます(ただし、おそらく異なるソースの場所)。そのタイプはメソッドにアクセスできます。

public class FooTest {
    @Test
    int testDoSomething() {
        Foo foo = new Foo();
        assertEquals(1, foo.doSomething());
    }
}
3
Rich Seller

パッケージは、クラスを柔軟に分離するために重要です。それらは以下に使用できます。

  • 分離プロジェクト
  • 分離モジュール
  • アプリケーション層(ビジネス、Web、Dao)の分離
  • さらにきめ細かいコード分離

例えば

com.mycompany.thisproject.thismodule.web

いくつかのモジュールのWebレイヤーを示すことができます。

2
Mercer Traieste

最終的に、Javaでパッケージを使用する3つの主な理由があります。

1)簡単なメンテナンス

classespackagesに整理すると、カプセル化による懸念事項の分離の原則に従い、システム設計全体の結束が向上します。さらに進むと、機能ごとのパッケージングにより、開発者のチームは、変更を行うための関連するクラスとインターフェイスを見つけ、アジャイル手法で使用されるスケーリングされたアプローチの垂直スライス技術をサポートできます。詳細については、ブログ投稿を参照してください: レイヤーではなく機能別にクラスをパッケージ化 および コーディング:垂直スライスによるパッケージ化

2)パッケージセキュリティの提供

パッケージは、含まれるクラスのメソッドのpublicアクセス修飾子のみへの外部アクセスを許可します。 protectedを使用するか、修飾子を使用しない場合、同じパッケージ内のクラスからのみアクセスできます。詳細については、投稿を参照してください: Which Javaアクセス修飾子は、他のパッケージのサブクラスのみがメンバーにアクセスできるようにしますか?

3)同様の命名を避ける

.NETの名前空間と同様に、クラス名は含まれるパッケージのスコープ内に含まれます。これは、2つの相互に排他的なパッケージに同じ名前のクラスを含めることができることを意味します。これは、パッケージ自体の名前が異なるため、完全修飾名が異なるためです。詳細については、チュートリアル[パッケージの命名:Javaチュートリアル] [3]を参照してください。

2
newmanicspree

トピックの Wikipedia ページから:

「Javaパッケージは、JavaクラスをModulaのモジュールと同様の名前空間に編成するためのメカニズムです。Javaパッケージは、JARファイルと呼ばれる圧縮ファイルに格納できます。クラスは一度に1つではなく、グループとしてより速くダウンロードできます。また、プログラマは通常、パッケージを使用して、同じカテゴリに属する​​クラスまたは類似の機能を提供するクラスを編成します。

0
Paul Sonier

また、これを採用する場合、どのようにグループ化する必要がありますか?

これは、プロジェクトで使用する設計パターンに大きく依存します。ほとんどの場合(特に初心者の場合)、機能またはその他の論理的な類似性によってグループ化する必要があります。

0
Yohnny

Javaの実装は非常に正確です。それは本当に混乱の余地を残していません。

全員が同じパッケージを使用する場合、2つのクラス名が衝突しないようにするための「ワールドワイド」な方法を見つける必要があります。

これにより、これまでに記述されたすべてのクラスが、必要がない場合に見る必要のない独自の「場所」に収まります。

システムの4つの異なる場所で異なる「ポイント」オブジェクトを定義できますが、クラスは期待するもののみを使用します(インポートするため)。

全員が自分のスペースを確保できるようにする方法は、リバースドメインを使用することです。そのため、私のものは「tv.kress.bill」です。私はそのドメインを所有しています。実際、兄弟「tv.kress.doug」と共有しています。同じドメインを共有していても、衝突することはありません。

社内の100の部門がそれぞれJavaで開発されている場合、それらは衝突することなく、Javaを正確に分割する方法を知らなくても開発できます。

この種の分割を行わないシステムは、今では本当に不安定なようです。個人用のスクリプトを一緒にハックするためにそれらを使用するかもしれませんが、厳密なパッケージングを行わずに大きなものを開発するのは不快に感じるでしょう。

0
Bill K

パッケージに関するもう1つの重要な点は、アクセス制御用の protected メンバーです。

保護は、パブリック(誰でもアクセス可能)とプライベート(内部クラスのみがアクセス可能)の間です。保護されているとマークされたものは、同じパッケージ内またはサブクラスからアクセスできます。これは、アクセスが制限されている場合、すべてを同じクラスに入れる必要がないことを意味します。

0
Tamar