パッケージコンテンツ
パッケージの内容は、機能的に関連するクラスとインターフェイスのみを含めるように慎重に設計する必要があります。パッケージ内のクラスは、パッケージ内の他のクラスの非プライベートメンバー以外のメンバーに自由にアクセスでき、一部のクラスでは、他のクラスの内部詳細にアクセスするのに十分な許可がある場合さえあります。このようなクラスがクラスメンバーを誤って操作することを避けるために、クラスメンバーを保護する必要があります。プライベートとして宣言されていないメンバーは、同じパッケージ内の他のすべてのタイプからアクセスできるため、無関係なクラスは予想よりも調整される可能性が高くなる可能性があります。
パッケージは、便利なインターフェイスとクラスを探しているプログラマーに論理的なグループ化も提供します。無関係なクラスで構成されるパッケージにより、プログラマーはどのインターフェイスとクラスが有用であるかをプログラマーが伝えることを困難にし、クラスの論理グループ化はプログラマーがコードを再利用するのに役立ちます。パッケージに関連する、しっかりと結合されたタイプセットのみが含まれている場合、名前の競合を避けるために、より直感的な名前を型に与えることができます。
パッケージはネストできます。たとえば、Java.Langはネストされたパッケージであり、パッケージLangがより大きなパッケージJavaにネストされていますが、パッケージJ AVAには他のパッケージも含まれています。ネスティングにより、関連するパッケージが階層構造を備えた命名システムを形成します。
たとえば、ニューラルネットワークや遺伝的アルゴリズムなどの適応システム用のパッケージのセットを作成するには、ドット分離名のパッケージに名前を付けてネストされたパッケージを作成できます。
パッケージアダプティブ。ニューラルネット;
上記の宣言ステートメントを含むソースファイルは、adaptive.neuralnetパッケージにあり、adaptive.neuralnetパッケージ自体は適応パッケージのサブパッケージです。適応パッケージには、一般化問題ステートメントクラスやベンチマーククラスなど、一般的な適応アルゴリズムに関連するいくつかのクラスが含まれる場合があります。階層のより深い位置にあるパッケージ(Adaptive.neu-LarnetまたはAdaptive.genetic)には、特定のタイプの適応アルゴリズムに関連するクラスが含まれています。
パッケージのネストは、関連するパッケージを整理するためのツールにすぎません。パッケージ間で特別なアクセス権は提供されません。
Adaptive.geneticパッケージのクラスコードは、パッケージアクセス権を持つAdaptiveまたはAdaptive.neuralNetパッケージのメンバーにアクセスできず、パッケージスコープは特定のパッケージにのみ適用できます。パッケージのネストは、関連するパッケージをグループ化することができ、プログラマーが論理レベルで望ましいクラスをより便利に見つけるのに役立ちますが、それを超えて、他の利点をもたらすことはありません。
パッケージノート
パッケージには注釈も付けることができます。しかし、問題は、パッケージは組織構造であり、ソースコードエンティティがなく、実際の定義がないため、クラスや方法のように注釈を付けることができないことです。したがって、パッケージアノテーションは、ソースファイルでパッケージの宣言声明を注釈することによってのみ達成できます。ただし、各パッケージには、その上に作用する注釈を持つことができるパッケージ宣言は1つだけです。
では、どのようにパッケージに注釈を付けますか?実際、Javaは、プログラマーが「単一の注釈付きパッケージステートメント」ルールに対処するための何らかの方法を使用することを強制しません。推奨される方法は、パッケージディレクトリにPackage-I nfo.javaという名前のファイルを作成することです。パッケージステートメントとパッケージの注釈のみが他のものを配置せずに保存されます。たとえば、attrパッケージのパッケージinfo.javaファイルは次のようになります。
@PackagesPec(2つの「attrプロジェクト」、バージョン= "1.0" @developmentsite( "attr.project.org")@developmentModel( "open-source")パッケージattr;
PackagesPec、DevelopmentSite、および開発OpmentModelは、注釈タイプを変更するために使用されます。もちろん、彼らはランタイム節約戦略を持っています。パッケージinfo.javaファイルは、パッケージ内の他のソースファイルとコンパイルする必要があります。
パッケージ関連のすべての情報をパッケージinfo.javaファイルに配置することをお勧めします。これを行うと、ファイルの先頭にドキュメントコメントを配置して、これらのドキュメントにパッケージドキュメントとして注釈が付けられます。
パッケージオブジェクトと仕様
通常、パッケージはいくつかの仕様を実装し、通常は組織からのものです。パッケージオブジェクトは他の反射タイプとは異なり、パッケージの作成または操作に使用することはできませんが、パッケージ(タイトル、ベンダー、およびバージョン番号)によって実装された仕様に関する情報を提供する情報を提供するための知識ベースとしてのみ機能します。通常、パッケージは個々の組織からのものですが、実装する仕様(統計分析ライブラリなど)は、他の組織によって定義される場合があります。パッケージを使用するプログラムは、特定のバージョンでのみ定義されている機能を使用できるように、パッケージによって実装された仕様のバージョンを知る必要がある場合があります。同様に、これらのプログラムは、主に異なるバージョンで考えられる欠陥に対処するために、どの実装バージョンが提供されているかを知る必要がある場合があります。パッケージクラスの主な方法のいくつかは、この情報へのアクセスを可能にします。
たとえば、システム内のjava.langパッケージからこの情報を抽出すると、次の結果が得られます。
仕様タイトル:JavaプラットフォームAPI仕様仕様バージョン:1.4仕様ベンダー:Sun Microsystems、Inc。実装タイトル:Javaランタイム環境実装バージョン:1.5.0_02実装ベンダー:Sun Microsystems、Inc。
標準バージョン番号は、「2.0」や'11 .0.12 'などの周期区切り文字によって区切られた非陰性数字で構成されています。このパターンを使用すると、iscompatible withメソッドを呼び出して、このパターンに続くバージョン番号をパッケージのバージョン番号と比較できます。パッケージのバージョン番号が後継者のバージョン番号以上である場合、メソッドはtrueを返します。この比較は、一度に期間分離された数のみを比較します。これらの数値のいずれかが、渡されたバージョン番号の対応する位置よりも小さい場合、2つのバージョンは互換性がありません。バージョン番号の1つが他のバージョン数よりも長い場合、短いバージョン番号の欠落部分はゼロと見なされます。たとえば、パッケージの正規バージョン番号が「1.4」で、「1.2」、「1.3.1」、または「.1.81。」と比較すると、trueが返されます。ただし、「1.4.2 '。または「.5」と比較すると、falseが返されます。この結論は、仕様バージョンが後方互換であると想定しているため、この結論が描かれます。
実装バージョン番号の指定形式はありません。これは、実装を提供するさまざまな組織が実装バージョンを異なる方法で定義するためです。実装バージョン間で行うことができる唯一の比較は、バージョンが同じかどうかをテストすることであり、後方互換性の仮定がない場合です。
パッケージを密封することができます。つまり、クラスをパッケージに追加できなくなります。封印されていないパッケージには、クラスの検索パス内の複数の異なる場所からのクラスを含めることができますが、密閉されたパッケージの内容は、特定のアーカイブまたはURLで指定された場所から同じ場所から来る必要があります。パッケージが密封されているかどうかを判断するには、次の2つの方法があります。
.public boolean issealed p:パッケージが密閉されている場合はtrueoを返します
.Public Boolean Issealed(URL URL):特定のURLに対してパッケージが密閉されている場合、つまりパッケージ内のクラスをこの指定されたURLからロードできます。特定のURLからパッケージのクラスをロードできない場合、またはパッケージが密閉されていない場合、Falseが返され、パッケージの仕様と実装情報は通常、パッケージに保存されているマニフェストファイルの一部として提供されます。パッケージ内のクラスがロードされると、この情報は人によって読まれます。クラスローダーは、ロードするクラスのパッケージオブジェクトを動的に定義できます。
指定されたクラスのクラスオブジェクトのGetPackageメソッドを呼び出して、このクラスのパッケージオブジェクトを取得できます。また、特定のパッケージ名を使用して静的パッケージを呼び出してパッケージオブジェクトを取得するか、Static Package.getPackagesを呼び出すこともできます。どちらの方法も、コードを呼び出すクラスローダーに関連しています。これらのコードは、クラスローダーのゲットパッケージまたはgetパッケージメソッドを呼び出すためです。これらのクラスローダーのメソッドは、特定のクラスローダーとすべての親クラスローダーを検索し、現在のクラスローダーの設定が行われない場合、現時点ではシステムクラスローダーが使用されます。パッケージが不明の場合、この時点でパッケージ内のタイプがロードされていないため、クラスローダーメソッドがNULLを返すことに注意してください。