7

私は、有効であるためには、いくつかの変数に接頭辞付きの値のいずれかが含まれている必要がある検証パターンをよく実行しました。

PSEUDO CODE:
    IF x == CONSTANT_1 || X == CONSTANT_2 || ... || x == CONSTANT_N
    THEN X is valid

OR 用語の連鎖を避けるために、すべての定数を含む静的な最終的な変更不可能なセットを作成しました。

public final static String CONSTANT_1 = *value* ;
public final static String CONSTANT_2 = *value* ;
...
public final static String CONSTANT_N = *value* ;

public final static Set SET_OF_CONSTANTS = Collections.unmodifiableSet(new HashSet(){
    private static final long serialVersionUID = 1L;
    {
        add(CONSTANT_1); 
        add(CONSTANT_2);
        ...
        add(CONSTANT_3);
    }
});

そして、次の方法でチェックを実行します。

if(!SET_OF_CONSTANTS.contains(x)){ 
    //X NOT VALID 
}

これが優れたプログラミング手法であるかどうか、代替手段があるかどうか、OR タームチェーンの代わりにハッシュ テーブル クエリ (理論的には O(1)) を使用するとパフォーマンスが向上するかどうかを知りたいです。コードの可読性。

4

2 に答える 2

15

全体的にスタイルはとても良いと思います。

大きな違いはありませんが、個人的にはSET_OF_CONSTANTS次のように定義します。

      public final static String CONSTANT_1 = "*value*";
      public final static String CONSTANT_2 = "*value*";
              ...
      public final static String CONSTANT_N = "*value*";

      public final static Set<String> SET_OF_CONSTANTS = Collections.unmodifiableSet(
        new HashSet<String>(Arrays.asList(
              CONSTANT_1, 
              CONSTANT_2,
                      ...
              CONSTANT_N
              )));

CONSTANT_1個別の定数が必要なのか、それとも単に値を に折りたたむことができるのかは、私には完全には明らかではありませんSET_OF_CONSTANTS

パフォーマンスに関する限り、実際のデータでコードをプロファイリングするまで、何も最適化を開始しません。

x最後に、 whenが文字列の場合、次はおそらく正しくないことに注意してください。

IF x == CONSTANT_1 || x == CONSTANT_2 || ... || x == CONSTANT_N

ここで、==はおそらく への呼び出しに置き換える必要がありますequals()

于 2012-12-11T12:44:00.720 に答える
2

別の (より短い) 方法は、 Set.of を使用することです。

public final static Set SET_OF_CONSTANTS = Collections.unmodifiableSet(
    Set.of(CONSTANT_1, CONSTANT_2, CONSTANT_3));
于 2018-12-19T12:28:41.093 に答える