5

プロパティファイルにいくつかのデータがあります。このデータは、多くのクラスで使用されます。したがって、すべてのクラスに Properties クラス オブジェクトを作成し、getProperty() メソッドを使用してデータを読み取ります。これはコードの重複につながります。

これを回避するためのベストプラクティスを誰かが提案できますか?

私の頭に浮かんだことの 1 つは次のとおりです。
クラスを作成し
ます。このクラスのプロパティ ファイルに各プロパティのパブリック変数を用意します。すべての
プロパティに値を割り当てるメソッドを用意します
。プロパティ値が必要なクラスで、このオブジェクトを作成します。クラスを作成し、パブリック変数にアクセスします

しかし、このアプローチで気に入らないのはパブリック変数です。新しいプロパティがプロパティ ファイルに追加された場合は、クラスでそのプロパティを読み取るコードを追加する必要があります。

どんな助けでも大歓迎です。

ありがとうございました!

4

6 に答える 6

20

初めて呼び出されたときにプロパティをロードするシングルトン クラスと、特定のプロパティ キーのプロパティ値を取得するパブリック メソッドを作成できます。

これは、標準の Properties ファイルを使用していると仮定しています...ただし、Properties タイプを Map などに変更して、これを任意のキーと値のペアに推定できます。

何かのようなもの

public class PropertyHandler{

   private static PropertyHandler instance = null;

   private Properties props = null;

   private PropertyHandler(){
         // Here you could read the file into props object
         this.props = ..... 
   }

   public static synchronized PropertyHandler getInstance(){
       if (instance == null)
           instance = new PropertyHandler();
       return instance;
   }

   public String getValue(String propKey){
       return this.props.getProperty(propKey);
   }
}

次に、必要に応じてこれを呼び出すことができます..任意のコードから..このように。

String myValue = PropertyHandler.getInstance().getValue(propKey);

お役に立てれば

于 2013-08-29T17:31:51.863 に答える
2

私にとって、静的内部クラスはそれを行うための最良の方法です。クラスのロードが同期されるため、スレッドセーフであり、パフォーマンスも高いため、遅延して実行されます。これにより、次の 3 つのことが達成されます。

  1. 同期すると活気が損なわれるため、パフォーマンスは良好ですが、ここでは静的内部クラスを使用しています。
  2. クラスのロードがスレッドセーフであるため、内部クラスがロードされるときにマップのみが初期化されるため、スレッドセーフであるため、すべてのスレッドセーフです。
  3. 呼び出し時に内部クラスがロードされるSingleton.initialize().get(key)ため、マップは遅延して初期化されます。

以下はコードです...

public class SingletonFactory 
{   
    private static class Singleton
    {
        private static final Map<String, String> map = new HashMap<String, String>();
        static
        {
            try
            {
                //here we can read properties files
                map.put("KEY", "VALUE");
            }
            catch(Exception e)
            {
                //we can do the exception handling
                System.out.println(e);
            }
        }
        private static Map<String, String> initialize()
        {   
            return map;
        }
    }

    public static String getValue(String key)
    {
        return Singleton.initialize().get(key);
    }
}
于 2013-08-29T17:50:09.200 に答える
0

ここでデータフローを誤解している可能性がありますが、これは私にとって「正常」に見えるものです。

  • メソッドを作成しますreadPropFile
    • これにより、ファイルが読み取られ、見つかったプロパティが適切に解析されます。
    • Map<String, Object>これらのプロパティは、プロパティ名でハッシュされた に格納できます。
  • プロパティ ファイルを 1 回読み取ります (おそらく、アプリケーションの起動時、またはプロパティの読み込みが適切なとき) -->Propertiesオブジェクト (たとえば、props.
  • propsこれらのプロパティにアクセスする必要があるものすべてに 渡します。
    • または、明示的に渡したくない場合は、ここに示すように静的アクセサーを使用します。
  • を使用してプロパティにアクセスしますprops.get("PROPERTY_NAME")(内部でそのプロパティを検索するだけMapです)。
    • 文字列ルックアップを使用したくない場合は、有効なプロパティ名の列挙をどこかに保持し、それを使用してストレージ/ルックアップを実行できますが、新しいプロパティをファイルに追加するたびにその列挙を更新する必要があります。
于 2013-08-29T17:31:48.647 に答える