web-dev-qa-db-ja.com

Java)のパッケージとディレクトリの違い

Javaプロジェクトで、すべての。Javaファイルを同じフォルダーに保持することは、それらが同じパッケージにあることを意味しますか?

すべてのプロジェクトファイルを1つのフォルダーに保持するのと比較して、プロジェクトのパッケージを作成するの違いは何ですか?

このスレッド は私の質問に実際には対応していません。

14
jaymeht

パッケージとディレクトリの間には関係がありますが、それはyoが維持しなければならない関係です。 「mypackage1.mypackage2」にあるクラスがある場合、それはJavaコマンドが「mypackage1\mypackage2」という名前のディレクトリ構造でそのクラスを見つけることを期待していることを意味します(「後方」のWindows表記を想定)。そのディレクトリ構造は、名前がclasspathにある(または直接「現在のディレクトリ」にある)ディレクトリ(「myjava」と呼びましょう)にさらに埋め込まれています。

したがって、Javaクラス(内部的にはpackage mypackage1.mypackage2;)は、たとえば「\ Users\myName\myjava\mypackage1\mypackage2 \」にあり、クラスパスに「\ Users\myName\myjava」を配置するか、現在のディレクトリを「\ Users」に設定します。\myName\myjava "。

これを混同すると、クラスがまったく見つからないか、あいまいな「NoClassDefFoundError」のようなエラーが発生します。

なぜパッケージ(およびディレクトリ)を使用するのかについては、その理由は「名前空間」と「関心の分離」に関係しています(それらを調べてください) )。 Javaパッケージがなく、すべての「Java.lang」、「Java.io」、「Sun.misc」などのクラスが一緒になっていると、まっすぐに保つのがはるかに難しくなります。オフにすると、名前の「プレフィックス」を使用して、それらをまっすぐに保ち、名前の競合を回避する必要があります。また、論理グループの多くが失われます。

独自のプロジェクトでは、自分で作成する単純な小さなプログラムのパッケージを使用する必要はありませんが、他の人に渡す可能性のあるものを作成する場合は、「myname.myproject」などのパッケージを使用することをお勧めします(名前ともちろんプロジェクト)なので、あなたがそれを与える人は、名前の衝突なしにそれを他の人と組み合わせることができます。

大規模なアプリケーションでは、さらにレベルの分離を使用すると、関数をまっすぐに保つのに役立つため、すべてがどこにあるかがわかります。また、異なる機能領域間の「境界を越える」ことを思いとどまらせるので、無関係なロジックが絡み合うことはありません。

Eclipse(これを使用する場合)は、ディレクトリ名とパッケージ名を提供することを「望んで」おり、場合によっては(常にではありませんが)それらの同期を維持するため、問題を少し混乱させます。

13
Hot Licks
  • パッケージクラスに論理名前空間を提供します。

  • そして、これらのパッケージはディレクトリレベルの形式で保存され(ネストされたディレクトリに変換されます)、クラスに物理グループ化(名前空間)を提供します。

また、physical名前空間はlogical名前空間に準拠している必要があることに注意してください。できませんクラスにpackage com.demoを付けます。ディレクトリ構造:--\com\demo\temp\必要があります\com\demo\の下にあり、このディレクトリはclasspathに追加され、クラスは-になります。 visible JVMがコードを実行するときに。

次のディレクトリ構造があるとします。-

A
|
+-Sample.Java(contains Demo class under package B
|
+-Outer.Java(contains Demo class-no package)
|
+-B
| |
| + -Demo.class
|
+-C
| |
| + -Abc.class
|
+-Demo.class

クラスAbc.classおよびDemo.class(ディレクトリAの下)がどのパッケージの下でも定義されていないとします。一方クラスDemo.class(ディレクトリBの下)はpackage Bで定義されています。したがって、クラスパスに2つのディレクトリが必要です。--\A(2つのクラスの場合:-Demo.classB.Demo.class)および\A\C(クラスAbc.classの場合) )..

  • 異なるパッケージのクラスは同じ名前を使用できます。そのため、上記で定義した2つのDemo.classの間に競合は発生しません。これらは異なるpackagesにあるためです。これが、それらをnamespacesに分割することの全体的なポイントです。これは、クラスの一意の名前が不足することがないため、有益です。
8
Rohit Jain

クラスローダーサブシステムを理解することはあなたの質問に答えます。

Bill VennersによるJVM内 を参照して

完全修飾型名が与えられると、原始クラスローダーは何らかの方法で型の単純名に「.class」を加えたファイルを見つけようとする必要があります。したがって、JVMは、CLASSPATHという名前の環境変数に格納されているユーザー定義のディレクトリパスを検索します。原始ローダーは、適切な名前(タイプの単純な名前と「.class」)のファイルが見つかるまで、各ディレクトリをCLASSPATHに表示される順序で調べます。タイプが名前のないパッケージの一部でない限り、基本ローダーは、ファイルがCLASSPATH内のディレクトリの1つのサブディレクトリにあることを想定しています。サブディレクトリのパス名は、そのタイプのパッケージ名から作成されます。たとえば、原始クラスローダーがクラスJava.lang.Objectを検索している場合、各CLASSPATHディレクトリのJava\langサブディレクトリでObject.classを検索します。

5
om39a