2016-09-05 15 views
0

のJavaの列挙型の内側に定義された値に切り替えてください。しかし、私が望むのは、switch-caseでは、enum Valueで定義されている文字列を使用するということです。 にs1を使用すると、エラーが発生します。退出は何ですか?は、どのように私は、次のコードを持つ文字列

+0

使用しているJavaのバージョンは?エラーは何ですか? – shmosel

+0

私は 'case'に' s1'を使い、 'switch'には入れません – user3282758

答えて

1

列挙型には、列挙型をStringとして返すメソッド.name()があります。すべての "値"はこれに相当します。

フィールド、コンストラクタ、およびゲッターを削除し、現在getValue()を呼び出しているname()を呼び出すことができます。

さらに、toString()のデフォルトの実装ではname()が返されるため、toString()メソッドを削除しても効果はありません。

最後に、列挙型自体をオンにすることができます。

0

列挙型で、あなたの文字列が...実際にenumertor定数と同じであるので、それは少し冗長で完全にunnescessaryです...

これを試してみてください。

enum Value { 
    INSERT_ONLY, UPDATE_ONLY, UPSERT; 
} 

public static void main(String[] args) { 
Week obj = new Week() ; 
Value s = obj.getValue() ; 
     switch(s) { 
      case INSERT_ONLY : System.out.println("INSERT_ONLY") ; 
       break ; 
      case UPDATE_ONLY : System.out.println("UPDATE_ONLY") ; 
       break ; 
     } 
    } 
} 
+0

最終的に' MyClass'のオブジェクトをjsonオブジェクトに変換する必要があるので、これらの文字列が必要です。 – user3282758

+0

Enum canメソッド名()を呼び出すと文字列として出力されます。 –

0

あなたはそれを試みることができます次のようになります。

​​

基本的に、switch-statementはenum-namesを使用します。したがっての方法をValueobj.getValue()で返す必要はありません。

スイッチが文字列と組み合わせて動作しない理由を知りたい場合は、hereをご覧ください。 もう1つの提案:switch-statementにdefault-branchも追加してください。

0

私が正しく理解していれば、不明な文字列sで列挙定数を検索しようとしています。 caseの式をs1にすることができない理由は、compile-time constantである必要があります。これはs1ではありません。あなたの例では、主に理論的であると思われるので、私はいくつかのオプションを提案します、あなたはあなたの実際のケースに最も適したを選択することができます:列挙型の名前を想定し

  1. はそのvalue秒(場合と同じですただこれを行う、あなたは完全にフィールドをスクラップすることができます)、あなたはちょうどその名前で列挙型を検索しようとしている:

    MyClass.Value v = MyClass.Value.valueOf(s); 
    

    マッピングがs1見つかりされていない場合、これはIllegalArgumentExceptionがスローされます。まだ名前を想定し

  2. は同じですが、あなたはいくつかの追加の例およびカスタム・ロジックと実際のswitchが必要なのか:

    try { 
        MyClass.Value v = MyClass.Value.valueOf(s); 
        switch (v) { 
         case INSERT_ONLY : System.out.println("INSERT_ONLY") ; 
          break ; 
        } 
    } catch (IllegalArgumentException e) { 
        switch (s) 
         case "s2" : System.out.println("s2") ; 
          break ; 
        } 
    } 
    
  3. 名が実際には同じでない場合は、静的を追加することができますvalueOf()をシミュレートする列挙クラス内の定数のマップ、:

    public enum Value { 
        ONLY_INSERT("ONLY_INSE"), ONLY_UPDATE("UPDATE_ONLY"), UPSERT("UPSERT") ; 
    
        private static final Map<String, Value> byName = new HashMap<>(); 
        static { 
         for (Value v : values()) { 
          byName.put(v.getVal(), v); 
         } 
        } 
    
        public static Value byName(String name) { 
         Value result = byName.get(name); 
         if (result == null) { 
          throw new IllegalArgumentException("Invalid name" + name); 
         } 
         return result; 
        } 
    
        private final String val ; 
        private Value(final String v) {val = v ;} 
        public String toString() {return val ;}  
        public String getVal() { 
         return val; 
        } 
    } ; 
    

    今、あなたはMyClass.Value.byName()を使用して、従来のソリューションと同じ操作を行うことができます。

関連する問題