簡単な質問です。.propertiesファイルから情報を読み取るいくつかのクラスを持つプログラムがあります。コンストラクターで引数としてクラスからクラスにファイルを渡すか、各クラスでファイルを直接開く方がよいですか?
4 に答える
これを手動で行う場合は、コンストラクターを介してファイルを取得し、プロパティ値をメンバー変数に読み取る構成クラスを作成することをお勧めします。次に、構成が必要な他のすべてのクラスは、コンストラクターを介して Configuration クラスを受け取ります。ただし、これを行う人はほとんどおらず、代わりに、プロパティ インジェクションを処理する spring のようなフレームワークを使用します。
春には、次のようになります。
<!-- application context xml file -->
<context:property-placeholder location="file:///some/path/to/file" />
次に、Javaクラスで:
public class SomeClass {
@Value("${some.property}")
private String someProp;
@Value("${some.other.prop}")
private Integer someOtherProp;
// ...
}
アプリケーションの起動時に、プロパティがクラスに挿入されます。
プログラムにコンパイルの一部である必要がなく、デプロイメントごとに異なる可能性のあるデータが含まれている場合は、それをプロパティファイルに追加する必要があります:(データベース接続文字列、電子メールアドレスなど)。
これが必要な場合に備えて、プロパティファイルにアクセスするためのコードを追加しています。ファイルをビルドディレクトリにドロップします。
Properties properties = new Properties();
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("credentials.properties"));
私の提案は、プロパティ ファイルをロードし、その Util から必要なクラスに値を取得する Util クラスを用意することです。
注: プロパティ ファイルの読み込みに問題はないと思います。
ファイルをコンストラクター引数として受け取り、すべてのインスタンス変数を設定する不変クラスを作成することをお勧めします。私はそれをPropertyConfigurationと呼んでいます。クラスは不変であるため、全員に渡すことを心配する必要はありません。それを保持するクラスを持つことさえできます。
たとえば、以下のコードは、プロジェクト全体でいくつかの機能を利用できるように設定します。スレッドの安全性を確保するために、共有されるものはすべて不変であることを確認します。
public class ClientUtils {
private static ClientContext _clientContext = null;
public static void setClientContext(ClientContext cc) {
_clientContext = cc;
}
public static ClientContext getContext() {
return _clientContext;
}
}
public class ClientContext {
private final Configuration _configuration;
public ClientContext(Configuration config){
_configuration = config;
}
public Configuration getClientContext() {
return _configuration;
}
}