2010-11-25 101 views
6

私が列挙型で表現されるint型の定数の値をリファクタリングしたいswitch文のセットJava enum:リファクタリングswitch文 'constant expression required'コンパイルエラー?

private static Object getValue(String stringValue, Parameter parameter) throws InvalidPatternException 
{ 
    Object result=null; 
    switch (parameter.getDataType()) 
    { 
     case GroupConstants.STRING_VALUE: // String value 
      result=stringValue; 
     break; 
     case GroupConstants.INTEGER_VALUE: // Long value 
     case GroupConstants.LONG_VALUE: 
     case GroupConstants.BOOLEAN_VALUE: 
     case GroupConstants.DATE_VALUE: 
.. 
} 

があるコードでは私のアプリ

public class GroupConstants { 
    .. 
    public static final int INTEGER_VALUE = 1; 
    public static final int LONG_VALUE = 2; 
    public static final int STRING_VALUE = 3; 
    .. 
} 

の定数を宣言するクラスを持っている

public enum DataType { 

    UNKNOWN_VALUE(0,"unknown"), 
    INTEGER_VALUE(1,"integer"), 
    LONG_VALUE(2,"long"), 
    STRING_VALUE(3,"string"), 
    BOOLEAN_VALUE(4,"boolean"), 
.. 
} 

ので、私のコードは、この

01のようになります。

と私は私のスイッチステートメントを変更することができます。列挙型を指すようにstatic最終的なint参照を変更すると、すべてのswitch文が中断します。

[javac] /home/assure/projects/tp/main/src/a/b/c/DDDDDManagerBean.java:1108: constant expression required 
[javac]    case GroupConstants.INTEGER_VALUE: 
[javac]        ^
[javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:203: constant expression required 
[javac]   case GroupConstants.INTEGER_VALUE: 
[javac]       ^
[javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:268: constant expression required 
[javac]    case GroupConstants.INTEGER_VALUE: 
[javac]        ^
[javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:316: constant expression required 
[javac]    case GroupConstants.INTEGER_VALUE: 
[javac]        ^
[javac] /home/assure/projects/tp/main/src/a/b/c/ParameterComponent.java:436: constant expression required 
[javac]   case GroupConstants.INTEGER_VALUE: 

私はすべてのスイッチをまだ変更したくないので、そこにきれいな回避策がありますか?

+0

は古い方法あなたのGroupConstantsされていない場合は、他の? DataType.INTEGER_VALUE:これはコンパイラエラーになるはずですか? –

+0

あなたがこれまでに示したことに基づいて、私は問題が何かを見ることができません。これは私が*あなたが何をしていると仮定しているかに基づいて動作するはずです。 'ParameterComponent'。しかし、もう一度、エラーメッセージは新しい 'DataType'クラスとは関係ありません。だから、おそらく私はコンパイルエラーの原因となっているコードを間違っています。コンパイルされないコード(例:ParameterComponentクラス)を貼り付けて、エラーの発生場所を強調表示できますか? –

答えて

5

これは動作しません。問題は、getId()呼び出しが、定数の値式がJLSに従ったコンパイル時定数式ではないことを意味します。詳細については、JLS 15.28 Constant Expressionsを参照してください。メソッド呼び出しが定数式で許可されていないことがわかります。

すべてのスイッチステートメントに大規模な変更を加えても、別の回避策はありません。しかし、私は心配しません。あなたのIDEは古い定数のすべての出現箇所を見つけて置き換えるのに役立つはずです。

フォロー

あなたのコメントから、次のコードは、いずれかの動作しません。

まず
private int INTEGER_VALUE_HOLDER = DataType.INTEGER_VALUE.getId(); 
public static final int INTEGER_VALUE = INTEGER_VALUE_HOLDER; 

INTEGER_VALUE_HOLDERJLS 4.12.4 Final Variablesの定義に基づいて「定数変数」ではありません。したがってどちらもINTEGER_VALUEです。

第2に、スタティックのイニシャライザ式はthisを参照できません。INTEGER_VALUE_HOLDERは実際にはthis.INTEGER_VALUE_HOLDERという別の方法です。

+0

あなたの正しい - 厄介な回避策は次のとおりです:プライベートint INTEGER_VALUE_HOLDER = DataType.INTEGER_VALUE.getId();パブリックstatic final int INTEGER_VALUE = INTEGER_VALUE_HOLDER;しかし、それはリファクタの目的を破る。 – emeraldjava

8

Javaはswitch文の列挙型をネイティブサポートしています。あなたのケースでは、あなたが言う必要があります。

DataType type = ...; 

switch (type) { 
    case UNKNOWN_VALUE 
     //do something 
     break; 
    case INTEGER_VALUE 
     //do something 
     break; 
    case LONG_VALUE 
     //do something 
     break; 
    case STRING_VALUE 
     //do something 
     break; 
    case BOOLEAN_VALUE 
     //do something 
     break; 
+0

スイッチ文を実行するためのEnumの使用について正しいこと。私の場合、DataTypeはObject型を表しているので、Enumを使用するようにスイッチをリファクタリングするのではなく、インタフェースを作成し、case文のロジックをオブジェクトに移動して、switch文をコードから削除できるようにします。 – emeraldjava

2

は、あなたのcase文でGroupConstants.接頭辞を取り除く試して​​みてください。私に完全にはっきりしない理由のため、クラス名の前に同じ定数を入れることはできません。

ので、代わりの

case GroupConstants.STRING_VALUE: 

てみてください。

case STRING_VALUE: 

あなたはそれをコンパイルするために、静的インポートが必要になる場合があります。日食IDEで

+1

なぜdownvote? –