これは大きなプログラミングの問題ではありませんが、もっと上手くやれるかどうか知りたいです。したがって、私は_Java.util.Properties
_クラスを介して読み取っている構成ファイルを持っています。プロパティがファイルに存在しない場合、getProperty()
メソッドはnullを返します。プロパティが構成ファイルに存在しない場合、例外をスローしたいと思います。それで、どうすればいいですか?
2つのアイデアが頭に浮かびますが、他の方法があるはずだと思います。 1つ目は、getProperty()
を呼び出すたびにif (prop == null) throw new SomeException
を実行することですが、2行ごとに同じifsがあると、見栄えがよくありません。 2番目のアプローチは、すべてのプロパティが読み取られた後に1つの大きなif
を作成し、一度にすべてをチェックすることです。
3番目のオプションは、これを行うプロパティの派生クラスを作成することです。
public class Configuration extends Properties {
public String getProperty(final String key) {
final String property = super.getProperty(key);
if(property == null) {
throw new InvalidParameterException(MessageFormat.format("Missing value for key {0}!", key)));
}
return property;
}
public String getProperty(final String key, final String defaultValue) {
// Throw exception here as above if you want to throw exception even with defaultValue
return super.getProperty(key, defaultValue);
}
}
私はそれをConfiguration
と呼びます。これは、プロパティが見つからない場合に例外がスローされる可能性があるためです。ただし、必要に応じて呼び出すこともできます。現在のように、パラメータgetProperty
を指定してdefaultValue
を呼び出すと、notが例外をスローします(おそらく、値が存在しないことで問題ないためです)。
余談ですが、これが本当にこれを処理したいかどうかを自問してください。プロパティファイルで期待する値がない場合があります。その場合、例外はありません。ただし、存在しない場合にアプリケーションが失敗する原因となる非常に具体的な値が見つかる場合は、このソリューションで十分です。
お役に立てば幸いです。
最善の解決策は、プロパティファイルの場所またはプロパティオブジェクトのいずれかで初期化するクラスConfiguration
を構築し、必要なすべての情報をコンストラクタで取得して、例外をスローすることです。必要な情報が見つからない場合(または、使用できる場合はデフォルト値を使用します)。
これには、起動後、必要なすべての値があり、再度チェックする必要がないことがわかるという利点があります。 ifステートメントをコード全体に広げる必要はありません。
また、デフォルトを使用する場合は、設定を複数の場所で使用しても、1つの場所にあります。ナイスでドライ。
Null以外のチェックは、value
を返すユーティリティnotNull(value, message)
メソッドであり、ifステートメントを減らすことができます。
マイナス面:すべての構成名を知っている神オブジェクトが作成されます。これも、特定のサブコンポーネントに対して異なるSubComponentNameConfiguration
オブジェクトをインスタンス化することで解決できます。
PS:本当に楽しいのは、特定のプロパティが「場所value
にあるファイルから特定の構成を読み取る」ことを意味する場合です。