51

私は初心者で、私が定義すると言うことを学びました

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

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

一部のJavaファイルをパッケージに入れる主な目的は何ですか?また、これを採用する場合、どのようにグループ化すればよいですか?

ありがとうございました


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

4

11 に答える 11

41

ウィキペディアの記事で説明されているように、「Javaパッケージ」の定義から始めましょう。

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

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

パッケージ

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

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

例:

  • com.sun.eng

  • com.apple.quicktime.v2

  • edu.cmu.cs.bovik.cheese

于 2009-07-06T18:30:20.843 に答える
14

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

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

于 2009-07-06T18:31:20.653 に答える
5

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

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

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

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

public class FooTest {
    @Test
    int testDoSomething() {
        Foo foo = new Foo();
        assertEquals(1, foo.doSomething());
    }
}
于 2009-07-06T20:00:26.947 に答える
4

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

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

于 2009-07-06T18:29:29.067 に答える
2

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

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

例えば

com.mycompany.thisproject.thismodule.web

一部のモジュールのWebレイヤーを示している可能性があります。

于 2009-07-06T18:31:07.207 に答える
2

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

1)より簡単なメンテナンス

に組織classes化するpackagesことは、カプセル化による関心の分離の原則に従い、システム設計全体のより良い結束を可能にします。さらに進んで、機能ごとのパッケージ化により、開発者のチームは、変更を加えるための関連するクラスとインターフェースを見つけることができ、アジャイル手法で使用されるスケーリングされたアプローチの垂直スライス技術をサポートします。詳細については、ブログ投稿:レイヤーコーディングではなく機能ごとにクラスをパッケージ化する:垂直スライスごとにパッケージ化するを参照してください。

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

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

3)同様の命名は避けてください

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

于 2017-06-17T03:22:31.660 に答える
0

トピックに関するウィキペディアのページから:

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

于 2009-07-06T18:29:01.127 に答える
0

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

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

于 2009-07-06T18:31:52.617 に答える
0

Javaの実装は非常に正確です。それは実際にいじくり回す余地を残しません。

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

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

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

彼らが誰もが自分のスペースを持っていることを保証する方法はあなたのリバースドメインを使用することです、それで私のものは「tv.kress.bill」です。私はそのドメインを所有しています。実際、私はそれを兄の「tv.kress.doug」と共有しています。同じドメインを共有していても、衝突することはありません。

あなたの会社の100の部門がそれぞれJavaで開発している場合、彼らは衝突することなく、そしてそれを分割する方法を正確に知っていることなくそれを行うことができます。

この種の分割を行わないシステムは、今では本当に不安定に見えます。私はそれらを使って個人的な何かのスクリプトを一緒にハックするかもしれませんが、厳密なパッケージングを行わずに大きなものを開発するのは不快だと思います。

于 2009-07-06T18:36:51.373 に答える
0

他の人々は非常にJava固有の答えを提供しましたが、これは問題ありませんが、ここに例えがあります。なぜファイルをハードドライブ上のディレクトリに整理するのですか?すべてが1つのディレクトリにあるフラットなファイルシステムを使用しないのはなぜですか?

もちろん、答えはパッケージが組織を提供するということです。データベースとインターフェイスするプログラムの部分は、ユーザーにUIを表示するプログラムの部分とは異なるため、それらは異なるパッケージに含まれます。

ディレクトリと同様に、名前の競合を解決する方法も提供します。異なるパッケージに表示される2つのクラスを持つことができるのと同じ方法で、いくつかの異なるディレクトリにtemp.txtを置くことができます。これは、(1)インターネット上で他の人とコードを組み合わせ始めるとき、または(2)Javaのクラスローディングがどのように機能するかを理解するときにも重要になります。

于 2009-07-06T19:03:10.853 に答える
0

パッケージに関するもう1つの重要な点は、アクセス制御のために保護されたメンバーです。

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

于 2009-07-06T19:08:51.543 に答える