2012-04-05 7 views
3

私はJava Enumを使用するのが初めてで、文字列リテラルを比較するIFロジックを置き換えることを読んでいます。私は下のコードをEnumと置き換える方法を全く理解していません。 applyEQに渡されるcol値に基づいて、私はその値の次のメソッド呼び出しをベースにする必要があります。私は可能な値を事前にcolの値を知っていると私は今の定数ファイルを使用しています。列挙型を作成し、それを定数ファイルのインターフェイスに配置する必要がありますか?文字列リテラルを置換する/ elseIfブロックがEnumである場合

public class FilterHelper implements IFilterHelper { 

    private final EQuery eQuery; 

    public FilterHelper(EQuery query) { 
     eQuery = query; 
    } 

    @Override 
    public void applyEQ(String col, String val) throws Exception { 
     int return = 0; 
     if (col.equalsIgnoreCase(EConstants.NAME)) { 
      ret = Sample.addName(eQuery, val); 
     } else if (col.equalsIgnoreCase(EConstants.KEYWORDS)) { 
      ret = Sample.addKey(eQuery, val); 
     } else if (col.equalsIgnoreCase(EConstants.ROLE)) { 
      ret = Sample.addRole(eQuery, val); 
     } 

     if (return != 0) { 
      throw new Exception("failed"); 
     } 
    } 
} 

EConstants.java

public final class EConstants {  
    public static final String NAME = "cewName"; 
    public static final String KEYWORDS = "cewKeywords"; 
    public static final String ROLE = "cewRole"; 
} 
+0

'EConstants'をEnumクラスに変換すると、String比較の代わりに' switch/case'を使うことができます。 – anubhava

+1

java7では文字列にswitch \ caseを使うことができます:http://javarevisited.blogspot.com/2011/08/string-switch-case-jdk7-example.html – shem

+0

私はJava 6を使用しています。ちょうどfyi – c12

答えて

2

まずenumを作成します。

public enum EConstants { 
    CEWNAME, 
    CEWROLE, 
    CEWKEYWORDS; 
} 

その後、このenumcol文字列を変換し、switchを使用:EConstants.valueOf()はを投げることができることを

public void applyEQ(String col, String val) throws Exception { 
    int ret = 0; 
    final EConstants constant = EConstants.valueOf(col.toUpperCase()); 
    switch(constant) { 
     case CEWNAME: 
      ret = Sample.addName(eQuery, val); 
      break; 
     case CEWROLE: 
      ret = Sample.addRole(eQuery, val); 
      break; 
     case CEWKEYWORDS: 
      ret = Sample.addKey(eQuery, val); 
      break; 
     default: 
      throw new Exception("Unhandled enum constant: " + constant); 
    } 
} 

注意をcol.toUpperCase()がいずれの定数値とも一致しない場合。あなたの生の場合

private int processSample(String val, EConstants constant) throws Exception { 
    switch(constant) { 
     case CEWNAME: 
      return Sample.addName(eQuery, val); 
     case CEWROLE: 
      return Sample.addRole(eQuery, val); 
     case CEWKEYWORDS: 
      return Sample.addKey(eQuery, val); 
     default: 
      throw new Exception("Unhandled enum constant: " + constant); 
    } 
} 
+0

switch文の問題は、新しい列挙値を追加すると、コンパイラはswitch文の更新を指示しないということです。多態性を使用したソリューションについては、私の答えを参照してください。 – Puce

2

あなたは列挙型としてあなたEConstantsを書き換えることができます。

public enum EConstants { 
    NAME, KEYWORDS, ROLE 
} 

そして、switchステートメントを使用して条件を評価:

// col has type of EConstants 
switch (col) { 
    case NAME: 
    // do something 
    break; 
    case KEYWORDS: 
    // do something 
    break; 
    case ROLE: 
    // do something 
    break; 
    default: 
    // what to do otherwise 
    break; 
} 
+0

ですそのJavaを有効にしますか?私はそうは思わない。 – Thomas

+0

あなたはswitch(col){case NAME:...}を意味しますか? – Dan

+0

そうではありません。今はそうです。 – ahanin

0

基本的に列挙型を作成し、タイプをcolに変更し、equals()または==を使用して、colの値と列挙型の値を比較します。あるいは、switchステートメントを使用することもできますが、3つの定数だけでコードを読みやすくすることはできません。

例:

enum EConstants { 
    NAME, 
    KEYWORDS, 
    ROLE; 
} 

public void applyEQ(EConstants col, String val) throws Exception { 
    if(col == EConstants.NAME) { 
    ... 
    } 
    .... 
} 

//or 

public void applyEQ(EConstants col, String val) throws Exception { 
    if(EConstants.NAME.equals(col)) { //col might be null 
    ... 
    } 
    .... 
} 

//or 

public void applyEQ(EConstants col, String val) throws Exception { 
    switch(col) { 
    case NAME: 
     ... 
     break; 
    case ROLE: 
     ... 

    } 

} 
0

http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

final EConstants constant = EConstants.valueOf(col.toUpperCase()); 
final int ret = processSample(val, constant); 

そして、方法自体:

ところで、私は複数の場所(とbreakキーワード)で初期化ローカル変数を嫌い、抽出方法してみてくださいデータは文字列ですが、列挙型を割り当てるには文字列の比較を行う必要があります。これは、結果データに対して多くの比較を行う方が速いかもしれませんが、そうでない場合は、コードに複雑さを加えるだけです。

コレクションのような列挙型の値を反復処理することができます。これにより、定数を追加する必要があるときに利点が得られます。悪くない。

ここ

はそれを行う方法です:

public enum EConstants { 
    NAME, KEYWORDS, ROLE 
} 
... 
public EConstants setConstant(String from) { 
    if (from.equalsIgnoreCase("cewName")) { 
     return NAME; 
    } else if (col.equalsIgnoreCase("cewKeywords")) { 
     return KEYWORDS; 
    } else if (col.equalsIgnoreCase("cewRole")) { 
     return ROLE; 
    }  
} 

あなたはそのように、あなたのデータを前処理すると、今、あなたが列挙型の値にスイッチを使用することができ、ロジックを把握しようとしているとき。

1

Enumを作成することをお勧めします。

public Enum AvailableCols{ 
     COL_1, 
     COL_2; 
    } 

public void applyEQ(AvailableCols col, String val) throws Exception { 
     switch(col){ 
      case COL1: 
      ... 

ような手順を変換あなたはまだ文字列を保存したい場合は、ここでは、次のpost

0

を見ることができますあなたのためのトリックです。いいえswitch/case(ちょうどEConstantsのより良い名前が出てくる)。

public enum EConstants { 
    NAME, 
    KEYWORDS, 
    ROLE; 

    private interface Applier { 
    void apply(EQuery query, String val); 
    } 

    public void apply(EQuery query, String val) { 
    map.get(this).apply(query, val); 
    } 

    private static Map<EConstants, Applier> map = new HashMap<EConstants, EConstants.Applier>(); 
    static { 
     map.put(NAME, new Applier() { 

     @Override 
     public void apply(EQuery query, String val) { 
      Sample.addName(query, val); 
     } 

     }); 

     map.put(KEYWORDS, new Applier() { 

     @Override 
     public void apply(EQuery query, String val) { 
      Sample.addKey(query, val); 
     } 

     }); 

     map.put(ROLE, new Applier() { 

     @Override 
     public void apply(EQuery query, String val) { 
      Sample.addRole(query, val); 
     } 

     }); 
    } 
} 

は今、あなただけの書き込み:

@Override 
public void applyEQ(EConstants econs, String val) { 
    econs.apply(equery, val); 
} 
2

Javaの列挙型の素晴らしいところは、とりわけ、それはあなたがメソッドを定義することができますので、彼らは、タイプセーフ列挙パターンのための言語レベルのサポートを提供することで、それらをオーバーライドする。そして、あなたはこのようにそれを使用することができます

public enum CewColumn { 

NAME("cewName") { 

    @Override 
    public int add(EQuery eQuery, String val) { 
     return Sample.addName(eQuery, val); 
    } 
}, 
KEYWORDS("cewKeywords") { 

    @Override 
    public int add(EQuery eQuery, String val) { 
     return Sample.addKey(eQuery, val); 
    } 
}, 
ROLE("cewRole") { 

    @Override 
    public int add(EQuery eQuery, String val) { 
     return Sample.addRole(eQuery, val); 
    } 
}; 

private final String colName; 

private MyColumn(String colName) { 
    this.colName = colName; 
} 

private static final Map<String, CewColumn> COLUMNS = new HashMap<>(values().length); 
static{ 
    for (CewColumn cewColumn : values()){ 
     COLUMNS.put(cewColumn.colName, cewColumn); 
    } 
} 

public abstract int add(EQuery eQuery, String val); 

public static CewColumn getCewColumn(String colName){ 
    return COLUMNS.get(colName); 
} 
} 

: - >あなたは多型とswitch文を置き換える

CewColumn cewColumn = CewColumn.getCewColumn(colName); 
if (cewColumn != null){ 
    int ret = cewColumn.add(eQuery, val); 
} 

だから、これを行うことができます!

+0

+1、長期的にはあなたのソリューションは私のものより優れています。 –

関連する問題