2011-01-20 2 views
7

いくつかの設定をカスタマイズするために、プロパティファイルを選択しました。私はすべてのクラスにこれを追加する必要があります は、私は、プロパティは、クラスでクラス間でJavaプロパティを使用できるようにしますか?

Properties defaultProps = new Properties(); 
    try { 
     FileInputStream in = new FileInputStream("custom.properties"); 
     defaultProps.load(in); 
     in.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

を使用可能なオブジェクトにするために、次のコードを使用できますか?おそらく、すべてのクラスがこのファイルへのストリームを開くためではないでしょう。 しかし、これを正しく処理する方法がわかりません。 クラスMyPropertiesを作成し、クラスに必要なプロパティをインスタンス化する必要がありますか?

ありがとうございます!

+0

関連の答えを必要とするものうそます。http: //stackoverflow.com/questions/4362911/how-to-create-a-singleton-class/4363254#4363254 – BalusC

答えて

10

defaultPropsを初期化した後、そのコンテンツをアプリ内の他のオブジェクトで利用できるようにすることができます。パブリック静的アクセサメソッドを介して、例えば:

public class Config { 
    private static Properties defaultProps = new Properties(); 
    static { 
    try { 
     FileInputStream in = new FileInputStream("custom.properties"); 
     defaultProps.load(in); 
     in.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
    public static String getProperty(String key) { 
    return defaultProps.getProperty(key); 
    } 
} 

これが最も簡単な方法ですあなたはユニットテストのためのモックプロパティオブジェクトを設定するConfig方法を提供しない限り、しかし、それは、ユニットテストが困難になり、余分な依存関係を(作成し、 )。

代わりに、それを必要とする各オブジェクトにdefaultProps(またはそれからの個別の構成値)を注入することもできます。ただし、コール階層が深い場合は、多くのメソッドにパラメータを追加する必要があります。

+1

私はこの解決策が嫌いです。メソッドを非静的にしてシングルトンを作成すると、柔軟性が増し、コストはかかりません。 – maaartinus

+0

@maaartinus:どのようにシングルトンパターンをより柔軟に適用するのですか?抽象的な工場パターンと混同していませんか? – BalusC

+1

@maaartinus、シングルトンはこれをもっと柔軟にする方法はありますか?実質的にはこれはすでにシングルトン(それはすべての依存性荷物を持つユニークなグローバルオブジェクトである)で、インターフェイスの背後に隠れていることに注意してください。 –

0

これを処理する最良の方法が何であるかを判断するには、情報が少なすぎます。アクセサーを使用して公開したり、それを必要とする各クラスに渡したい場合があります。あるいは、各クラスが必要とするプロパティを取り出し、それらの値をクラスのコンストラクタに渡すこともできます。

0

プロパティを一度ロードし、他のクラスが引き出すことができるようにプロパティを格納します。それが静的な変数を参照するMyPropertiesクラスであれば問題ありません。

0

これは、何かをグローバルに利用できるようにする特別なケースです。静的メソッドを使用することは非常に悪いです。より良いが悪い解決策は、sigletonパターンを使用している。テストはここで最大の問題です。 IMHO、最も良い方法はDependency injectionを使用していますが、小規模なアプリケーションでは余計なことかもしれません。

3

プロパティクラスのインスタンスが1つだけ必要な場合は、singleton patternを使用できます。

それは、このようなクラスのようになります。この情報は、すべてのインスタンス間で静的である

public class MyProperties extends Properties { 
    private static MyProperties instance = null; 

    private MyProperties() { 
    } 

    public static MyProperties getInstance() { 
     if (instance == null) { 
      try { 
       instance = new MyProperties(); 
       FileInputStream in = new FileInputStream("custom.properties"); 
       instance.load(in); 
       in.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 
     return instance; 
    } 
} 
+0

"this.load(in);" "instance.load(in)"にする必要があります。 – icedek

+0

@icedek fixed(私の古い答えは何ですか?) – SirDarius

0

ので、私はsingletonとしてPropertiesクラスを実装するお勧めします。 staticinitialization blockメソッドを使用すると、プログラムの起動時に自動的にファイルを読み込ませることができます。

public class Properties { 
    static { 
    try { 
     FileInputStream in = new FileInputStream("custom.properties"); 
     load(in); 
     in.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 

    protected static void load(FileInputStream in) { 
    // existing load functionality here 
    } 
} 

内部ストレージメカニズムとアクセサーメカニズムはまだ必要です。これらにはstaticとマークする必要があります。

1

なぜ静的なResourceBundleを使用しないのですか?

static final ResourceBundle myResources = 
      ResourceBundle.getBundle("MyResources", currentLocale); 
0

すべてのクラスにプロパティをロードするのではなく、 main()のどこかにロードし、コンストラクタを介して他のクラスに渡します。

グローバルに共有しないでください。 - をテストすることが困難 - 抽象化に反対(グローバル・アクセス、DAOは、ユーザー設定にアクセスすることができ、それはすべてのもの...それは必要なものだけでなく渡すことによって阻止されなければならない。) - クラスは、彼らが

関連する問題