web-dev-qa-db-ja.com

プロパティファイルにプロパティが存在しない場合に例外をスローする

これは大きなプログラミングの問題ではありませんが、もっと上手くやれるかどうか知りたいです。したがって、私は_Java.util.Properties_クラスを介して読み取っている構成ファイルを持っています。プロパティがファイルに存在しない場合、getProperty()メソッドはnullを返します。プロパティが構成ファイルに存在しない場合、例外をスローしたいと思います。それで、どうすればいいですか?

2つのアイデアが頭に浮かびますが、他の方法があるはずだと思います。 1つ目は、getProperty()を呼び出すたびにif (prop == null) throw new SomeExceptionを実行することですが、2行ごとに同じifsがあると、見栄えがよくありません。 2番目のアプローチは、すべてのプロパティが読み取られた後に1つの大きなifを作成し、一度にすべてをチェックすることです。

6
ctomek

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が例外をスローします(おそらく、値が存在しないことで問題ないためです)。

余談ですが、これが本当にこれを処理したいかどうかを自問してください。プロパティファイルで期待する値がない場合があります。その場合、例外はありません。ただし、存在しない場合にアプリケーションが失敗する原因となる非常に具体的な値が見つかる場合は、このソリューションで十分です。

お役に立てば幸いです。

12
Neil

最善の解決策は、プロパティファイルの場所またはプロパティオブジェクトのいずれかで初期化するクラスConfigurationを構築し、必要なすべての情報をコンストラクタで取得して、例外をスローすることです。必要な情報が見つからない場合(または、使用できる場合はデフォルト値を使用します)。

これには、起動後、必要なすべての値があり、再度チェックする必要がないことがわかるという利点があります。 ifステートメントをコード全体に広げる必要はありません。

また、デフォルトを使用する場合は、設定を複数の場所で使用しても、1つの場所にあります。ナイスでドライ。

Null以外のチェックは、valueを返すユーティリティnotNull(value, message)メソッドであり、ifステートメントを減らすことができます。

マイナス面:すべての構成名を知っている神オブジェクトが作成されます。これも、特定のサブコンポーネントに対して異なるSubComponentNameConfigurationオブジェクトをインスタンス化することで解決できます。

PS:本当に楽しいのは、特定のプロパティが「場所valueにあるファイルから特定の構成を読み取る」ことを意味する場合です。

2