2016-10-14 15 views
1

何かが本当に奇妙です。 私は注釈値に静的な最終文字列を使用しています。Groovy - 注釈に静的な最終文字列を使用できません。

class Constants { 
    static final String myConstant = "ting tong" 
} 

class Service { 
    @CacheEvict(cacheNames = Constants.myConstant) 
    void doSomethingNice() {  
    } 
} 

しかし、私はそれをコンパイルすることはできません。

ここでエラーメッセージが

属性の 'my​​Constant' タイプ 'はjava.lang.String型' を持っている必要があります。しかし java.lang.Stringのタイプのインライン一定になるようにorg.springframework.cache.annotation.CacheEvict

期待 'Constants.getMyConstant()' @ に 型 'java.lang.Objectの' になっています@ org.springframework.cache.annotation.CacheEvict

何が問題になりますか?これはJavaで完璧に動作します

答えて

1

この問題は、Groovyの自動ゲッター/セッター生成が原因であることが判明しました。それは私の定数のためのゲッターを生成し、注釈内でそれを使用し、私はそれが許可されていないと思います。

修正するには、フィールドを公開としてマークします。これにより、自動ゲッタ生成が無効になります。

class Constants { 
    public static final String myConstant = "ting tong" 
} 
+0

あなたはどこにでも '' '' '' ''キーワードを追加していませんか? '' myConstant'''の宣言に '' static'''キーワードがなければ、それは*インスタンス変数*です。したがって、JavaまたはGroovyの*クラス変数* notation''''Constant.myConstant'''を使用してアクセスすることは不可能です。 – BalRog

+1

@BalRog oh yes。ごめんなさい。私は自分のクラスにstaticキーワードを持っていました。それに言及するのを忘れました。回答と質問を更新しました – Nerrve

+0

'public'キーワードは必要ありません。 'public'はGroovyのデフォルトです。 – BalRog

2

一般に、クラスの下ではなくインターフェイスの下に定数を保持することは良い習慣です。

interface Constants { 
    public static final String myConstant = "ting tong" 
} 

別のお勧めは、各定数のために1つだけのインスタンスを作成する方が効率的であるため、静的最終だけでなく、最終的なように定数を定義することです。

+0

インターフェイスに関するアドバイスをありがとう。私は実際に私のコードで静的だった。質問で正しく言及するのを忘れてしまった。 – Nerrve

関連する問題