在枚举中以匿名 class 声明实例变量
Declare instance variable in anonymous class inside enum
例如,Groovy 中的这段代码运行良好:
def f = new Runnable() {
def test = "Hello!"
@Override
void run() {
println(test)
}
}
f.run()
它打印 Hello!
到控制台。这里的主要思想是它在匿名 class 中使用实例变量。
但是当你将这样的匿名 class 实例化移动到枚举常量的参数时,现在它不起作用:
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)
^
它说变量是在静态范围内找到的(为什么?)但它甚至不能将它用作静态字段。
但是,它在匿名内部没有变量的情况下工作 class:
enum E {
E1(new Runnable() {
@Override
void run() {
println("Hello!")
}
})
def runnable
E(def r) {
runnable = r
}
}
E.E1.runnable.run()
如何强制 Groovy 像 Java 那样在匿名 class 中使用实例变量?
它也适用于 Groovy,尽管您必须使用 this.test
字段访问符号来引用 test
字段以满足 groovyc 编译器的要求:
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()
例如,Groovy 中的这段代码运行良好:
def f = new Runnable() {
def test = "Hello!"
@Override
void run() {
println(test)
}
}
f.run()
它打印 Hello!
到控制台。这里的主要思想是它在匿名 class 中使用实例变量。
但是当你将这样的匿名 class 实例化移动到枚举常量的参数时,现在它不起作用:
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)
^
它说变量是在静态范围内找到的(为什么?)但它甚至不能将它用作静态字段。
但是,它在匿名内部没有变量的情况下工作 class:
enum E {
E1(new Runnable() {
@Override
void run() {
println("Hello!")
}
})
def runnable
E(def r) {
runnable = r
}
}
E.E1.runnable.run()
如何强制 Groovy 像 Java 那样在匿名 class 中使用实例变量?
它也适用于 Groovy,尽管您必须使用 this.test
字段访问符号来引用 test
字段以满足 groovyc 编译器的要求:
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()