Java 定数文字列を 1 つの場所に配置し、プロジェクト全体 (多くのクラス) で使用したいと考えています。
これを達成するための推奨される方法は何ですか?
public static final String CONSTANT_STRING="CONSTANT_STRING";
定数は次のとおりです。
定数を保持するためだけにインターフェイスが使用される場合もありますが、インターフェイスは型の動作を定義することになっているため、これは悪い習慣と見なされます。
より良いアプローチは、それがより意味のあるクラスに保持することです。
例えば
JFrame
EXIT_ON_CLOSE
サブクラスがそれにアクセスできるすべてのクラスに定数があり、すべてのコンポーネントに閉じるオプションがあるわけではないため、保持することも保持しないJFrame
ことも理にかなっています。JFrame
JComponent
@mprabhat が前に回答したように、定数は、、、、public
およびstatic
大文字final
で入力する必要があります。
それらをクラスにグループ化すると、次のことができます。
あなたが持っているすべての定数を知る必要はありません。多くの IDE (Eclipse など) は、クラスが持つすべてのフィールドのリストを表示します。したがって、押すだけCTRL+SPACE
で、使用できる定数の手がかりが得られます。
コンパイル時にタイプセーフにする。sを使用した場合String
、 , のスペル"DATABASE_EXCEPTION"
を間違える可能性があり"DATABSE_EXSCEPTION"
、実行中にのみ気付く可能性があります (運が良く、まったく気付かなかった場合)。オートコンプリートを利用することもできます。
実行中にメモリを節約するのに役立ちます。定数の 1 つのインスタンスに必要なメモリは 1 つだけです。IE: (実際の例)String
コード内の異なるクラスで "DATABASE_EXCEPTION" が 1000 回ある場合、それぞれがメモリ内の異なるインスタンスになります。
その他の考慮事項:
javadoc コメントを追加して、定数を使用するプログラマーが定数に関するより多くのセマンティック情報を取得できるようにします。を押すとツールチップとして表示されますCTRL+SPACE
。いいえ:
/** Indicates an exception during data retrieving, not during connection. */
public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
/** Indicates an exception during the connection to a database. */
public static final String DATABASE_CONNECTION_EXCEPTION =" DATABASE_CONNECTION_EXCEPTION";
定数の識別子にセマンティックを追加します。定数があり、場合によってはyes"Y"
を意味し、他の場合はyearを意味する場合は、2 つの異なる定数の使用を検討してください。
public static final String Y = "Y"; // Bad
public static final String YEAR = "Y";
public static final String YES = "Y";
将来、定数の値を変更する場合に役立ちます。
/** Year symbol, used for date formatters. */
public static final String YEAR = "A"; // Year is Año, in Spanish.
public static final String YES = "S"; // Yes is Sí, in Spanish.
実行時まで定数の値がわからない場合があります。IE: 設定ファイルから読み取ることができます。
public class Constants
{
/** Message to be shown to the user if there's any SQL query problem. */
public static final String DATABASE_EXCEPTION_MESSAGE; // Made with the 2 following ones.
public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
public static final String MESSAGE = "MESSAGE";
static {
DATABASE_EXCEPTION_MESSAGE = DATABASE_EXCEPTION + MESSAGE; // It will be executed only once, during the class's [first] instantiation.
}
}
定数クラスが大きすぎる場合、または将来大きくなりすぎると思われる場合は、異なる意味 (セマンティック) のために異なるクラスに分割できます: ConstantDB
、ConstantNetwork
など。
欠点:
チームのすべてのメンバーは、同じクラスを使用し、定数に対して同じ命名法を使用する必要があります。大規模なプロジェクトでは、2 つの定義を見つけても不思議ではありません。
public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
public static final String EXCEPTION_DATABASE = "DATABASE_EXCEPTION";
数百行または異なる定数クラスで区切られています。さらに悪いことに:
/** Indicates an exception during data retrieving, not during connection. */
public static final String DATABASE_EXCEPTION = "DATABASE_EXCEPTION";
/** Indicates an exception during data retrieving, not during connection. */
public static final String EXCEPTION_DATABASE = "EXCEPTION_DATABASE";
同じ意味を持つ (同じ目的で使用される) 異なる値の異なる識別子。
可読性が低下する可能性があります。同じことをするためにもっと書く必要があります:
if ("Y".equals(getOptionSelected()) {
対
if (ConstantsWebForm.YES.equals(getOptionSeleted()) {
クラス内で定数をどのように順序付ける必要がありますか? アルファベット順?関連するすべての定数を一緒に?それらが作成された/必要な順序で?注文が正しいことについて誰が責任を負うべきですか?定数の (十分に大きな) 並べ替えは、バージョン管理システムでは混乱と見なされます。
うーん、思ったより時間がかかりました。ヘルプ/批評家は大歓迎です。
すべての定数を格納する定数のクラスを作成する必要があります。
ProjectNameConstants.java など
クラス名を介してアクセスできるため、すべての定数文字列 static が含まれています。
例えば
classname : MyAppConstants.java
public static final String MY_CONST="my const string val";
次のようにアクセスできます
MyAppConstants.MY_CONST
Constants
メイン パッケージ (つまり com.yourcompany) のベースで呼び出されるクラスを作成し、そこにすべての定数を含めます。また、コンストラクターをプライベートにして、このクラスからオブジェクトが作成されないようにします。
public class Constants {
private Constants() {
// No need to create Constants objects
}
public static final String CONSTANT_ONE = "VALUE_CONSTANT_ONE";
public static final String CONSTANT_TWO = "VALUE_CONSTANT_TWO";
}
public class SomeClass {
public static final String MY_CONST = "Some Value";
}
純粋な定数クラスであることが想定されている場合は、コンストラクターもプライベートにします。
public class Constants {
public static final String CONST_1 = "Value 1";
public static final int CONST_2 = 754;
private Constants() {
}
}
その場合、このクラスをインスタンス化することはできません。
あなたが探している正しい答えは
import static com.package.YourConstantsClass.*;
パブリックclass
を作成し、定数文字列ごとに次のようなフィールドを作成します
public static final String variableName = "string value";