web-dev-qa-db-ja.com

ベストプラクティスJava-文字列配列定数とそれにインデックスを付ける

文字列定数の場合、通常、final Stringの値。しかし、文字列配列を格納するためのベストプラクティスは何ですか。さまざまなカテゴリを定数配列に格納し、カテゴリが選択されるたびに、それがどのカテゴリに属し、それに基づいて処理することを知りたいです。

追加:より明確にするために、カテゴリA,B,C,D,Eは定数配列です。ユーザーがアイテムの1つをクリックすると(ボタンにはこれらのテキストが表示されます)、クリックされたアイテムを認識し、それに対して処理を行う必要があります。

enum(say cat)を定義でき、毎回

if clickedItem == cat.A
 ....
else if clickedItem = cat.B
 ....
else if 
 ....

または、各アイテムのリスナーを個別に登録することもできます。

しかし、私はこの種の問題を処理するためのベストプラクティスを知りたいと思っていました。

4
500865

私はEnumを使用してシステム全体の文字列定数を格納することを好み、追加の機能を簡単に作成でき、一般に受け入れられているベストプラクティスだと思います。

public enum Cat {
     A() {
          @Override public void execute() { 
               System.out.println("A clicked"); 
          }
     },
     B() {
          @Override public void execute() { 
               System.out.println("B Clicked"); 
          }
     };
     //template method
     public abstract void execute();
}

その後、次のように呼び出すことができます。

String clickedItem = "A";    
Cat.valueOf(clickedItem).execute(); //will print A is clicked

または、列挙型なしのコマンドパターンも使用できます。

public interface Cat {
     void do();
}

public class CatA() implements Cat {
     void do() {//put your code here}
}
public class CatB() implements Cat {
     void do() {//put your other code here}
}

次に、Mapオブジェクトを作成して、Catインスタンスを設定します。

catMap.put("A", new CatA());
catMap.put("B", new CatB());

次に、if/else ifチェーンを次のように置き換えます。

catMap.get(clickedItem).do();
6
NimChimpsky

あなたの説明はかなり漠然としているので、おそらく私はこれを間違っていたかもしれませんが、_Map<String,String>_を使用してカテゴリの関係を保存できるように思えます。例えば。あなたが持っている場合

_class Foo {
   final static String[] cat1 = {"val1_1","val1_2","val1_3"};
   final static String[] cat2 = {"val2_1","val2_2"};
}
_

私は書きます:

_class Foo {
  final static Map<String, String> map = new HashMap<String,String>();
  {
     map.put("val1_1","cat1");
     map.put("val1_2","cat1");
     map.put("val1_3","cat1");
     map.put("val2_1","cat2");
     map.put("val2_2","cat2");
  } 
}
_

次に、Foo.map.get("val1_1");を呼び出すのと同じくらい簡単にカテゴリを取得します。もちろん、マップを(たとえばファイルから)埋めるときは、私よりも少し賢くする必要があります。マップの変更が気になる場合は、_Collections.unmodifiableMap_を使用してラップします。

4
Landei