他のクラスで定数を使用するために、Java の別のクラスに定数を格納することは推奨されないと言われました (そして、このステートメントを他のいくつかの場所で見ました)。しかし、なぜそうなのかはどこにも見たことがありません。それらを独自のインターフェイス/クラスに保存してはならない理由は何ですか?
私は C から Java に移行しましたが、C では.h
定数を定義したファイルを作成するだけでした。#define
専用ファイル内の定数は、文体上の理由から嫌われています。定数専用のクラスがあると、開発者は、制御不能にゆっくりと肥大化するファイルにますます多くの無関係な (文書化されていない? ) 定数を追加するようになります。
対照的に、関連するクラスに定数を関連付けると、よりスケーラブルで読みやすい設計になります。
したがって、技術者として定数とその位置を技術的な選択として測定できます。これは、パフォーマンスが重要なシステムやクールな小さなスニペットで作業する場合に最適です。ただし、アプリケーションが成長する傾向にあると、コードに反映されたビジネス要件とエンドユーザーのニーズを把握することがますます難しくなります。
そのため、スタイル (個別のクラス、プロパティ ファイル、またはクラス内のネスト) について考える代わりに、ドメイン駆動型の設計に従う傾向があります。定数のセットが特定のクラス (エンティティ) に排他的に属している場合は、定数をネストします。概念がドメイン モデル内の複数のエンティティに関係する場合は、遠慮なく別のエンティティにします。
そして、覚えておいてくださいJava 5
、あなたはenums
自由に使えるので。
個別の定数クラスはオブジェクト指向設計ではありません。OO では、クラス (またはインターフェイス) はコントラクトを表し、定数のみを含むクラスはコントラクトを定義しません。
オブジェクト指向に関するもう 1 つの考慮事項は、個別の定数クラスが継承の誤用を助長することです。継承は、クラスが別のクラスまたはインターフェイスによって定義されたコントラクトに完全に準拠していることを示すと想定されています。機能や定数を共有するためだけに継承を使用しないでください。それがpublic
メソッドとフィールドの目的です。したがって、このコードは正しくありません。
class SomeApplicationClass
implements ScrollPaneConstants // Incorrect, import ScrollPaneConstants instead
問題は、それらが完全にソースコードの外に存在する必要があるということです。Apache Commons Configのようなものを使用するか、少なくとも.properties
ファイルからロードする必要があります。
また、合理的な範囲に関して「単一」を解釈していることにも注意します。たとえば、使用するすべてのJava開発者用の1つの構成ファイルがGoogleのサーバーに保存され、変更のリクエストフォームが含まれている必要はありません。おそらく、コードベース全体に対して行うべきではありません。ただし、UORまたはパッケージごとは妥当な範囲であり、実際に使用するものです。