2012-05-03 23 views
3

私はGroovyを手に入れているJavaプログラマです。私のコードでは、GroovyのA-Okayと思われるJava固有の構文が混在しています。Groovyでの静的文字列の使用Switch-Caseステートメント

Groovyが静的変数をCASEパラメータとして受け入れない理由を誰にも説明できますか?もしそうなら、私がここで間違っていることを見ることができますか?私は、これはあなたのコードは、あなたのために働いていない理由のあなたの質問に答えていませんが、あなたのコードを実装するために、わずかにgroovier /より良い方法をしたい場合は、そう、マップに自分の価値観を投げる可能性が知っている

public static final String HIGH_STRING = "high"; 
public static final String LOW_STRING = "low"; 

... //other code, method signature, etc. 

def val = "high"; 
switch (val) { 

    case HIGH_STRING: 
    println("string was high"); //this won't match 
    break; 

    case LOW_STRING: 
    println("string was low"); //this won't match 
    break; 

    //case "high": 
    // println("string was high"); //this will match because "high" is a literal 
    // break; 

    default: 
    println("no match"); 
} 

... //other code, method closeout, etc. 
+1

あなたのテストケースは私の仕事です。失敗した場所で完全なテストを投稿してください。また、groovyのどのバージョンを使用していますか? – ataylor

+0

あまりにも私のための作品:) –

+1

あなたたちは正しいです。私はGrailsアプリケーションで作業しています。サービスクラスでこの 'switch 'をやっています。私のアプリが動いている間に 'public static final'宣言を追加しました。Grailsはそれに応じてクラスを更新しているようです。私はそうではないことを発見しました(奇妙なことに、他のコードの変更が行われていたときに、それらの 'public static final'varsのみで)。私は自分のアプリを新しく再起動し、今は動作します。 – Marc

答えて

4

IMO switchより

class ValueTests { 
    public static final String HIGH_STRING = "high" 
    public static final String LOW_STRING = "low" 

    @Test 
    void stuff() { 
     assert "string was high" == getValue("high") 
     assert "string was low" == getValue("low") 
     assert "no match" == getValue("higher") 
    } 

    def getValue(String key) { 
     def valuesMap = [ 
      (HIGH_STRING): "string was high", 
      (LOW_STRING):"string was low" 
     ] 
     valuesMap.get(key) ?: "no match" 
    } 

} 

少しクリーナー:あなたはswitchステートメントを使用する必要はありません。

+0

これはまさに私が探していたものではありませんが、上記の私のコメントから、これは私自身の不自然な欠点であり、これは機能していないことがわかります。あなたがここで提供した面白いアプローチです。誰でも正解に投稿したものに最も近いものですから、私はそれを受け入れます。私はこのものに近づく新しい方法を学ぶのが好きなので、時間をとってくれてありがとう! – Marc

関連する問題