2017-10-27 3 views
3

内の匿名クラスでインスタンス変数を宣言し、Groovyでこのコードはうまく機能:は、例えば列挙

def f = new Runnable() { 
    def test = "Hello!" 
    @Override 
    void run() { 
     println(test) 
    } 
} 

f.run() 

それはコンソールにHello!を印刷します。ここでの主なアイデアは、匿名クラス内でインスタンス変数を使用することです。あなたは、一定の引数を列挙するために、このような匿名クラスのインスタンスを移動すると しかし、今では動作しません:

enum E { 
    E1(new Runnable() { 
     def test = "Hello!" 
     @Override 
     void run() { 
      println(test) 
     } 
    }) 

    def runnable 

    E(def r) { 
     runnable = r 
    } 
} 

E.E1.runnable.run() 

エラーがコンソールに表示されます。

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: 
ideaGroovyConsole.groovy: 23: Apparent variable 'test' was found in a static scope but doesn't refer to a local variable, static field or class. Possible causes: 
You attempted to reference a variable in the binding or an instance variable from a static context. 
You misspelled a classname or statically imported field. Please check the spelling. 
You attempted to use a method 'test' but left out brackets in a place not allowed by the grammar. 
@ line 23, column 21. 
       println(test) 
        ^

これは、変数が(静的スコープで発見されたと述べていますなぜ?)でも、それを静的フィールドとして使用することさえできません。

しかし、それは匿名クラス内の変数せずに動作します:

enum E { 
    E1(new Runnable() { 
     @Override 
     void run() { 
      println("Hello!") 
     } 
    }) 

    def runnable 

    E(def r) { 
     runnable = r 
    } 
} 

E.E1.runnable.run() 

、Javaのような匿名クラス内のインスタンス変数で動作するようにGroovyのを強制的にどのように?

+0

内部クラスは、Groovyのは、Javaから少し外れるこれらの分野のいずれかです。 http://groovy-lang.org/differences.html#_inner_classes – bdkosher

+0

@bdkosherはい、私は[こちら](http://www.groovy-lang.org/single-page-documentation.html)を読んでいますが問題です私の質問では、より多くの驚いたリンクの違いを述べた – cybersoft

答えて

3

あなたはgroovycコンパイラを満足させるためにthis.testフィールドアクセスの表記を使用してtestフィールドを参照する必要があるが、それは、同様のGroovyでなんとかです:

enum E { 
    E1(new Runnable() { 
     def test = "Hello!" 

     @Override 
     void run() { 
      println(this.test) 
     } 
    }) 

    def runnable 

    E(def r) { 
     runnable = r 
    } 
} 

E.E1.runnable.run() 
+0

だから簡単!ありがとうございました – cybersoft