在使用 Groovy In Action 的Groovy处理Java Bean的部分中,我找到了这个脚本(略有修改):
class Book{
String title
}
def groovyBook = new Book()
// explicit way
groovyBook.setTitle('What the heck, really ?')
println groovyBook.getTitle()
// short-hand way
groovyBook.title = 'I am so confused'
println groovyBook.title
班级Book
中没有这样的方法,那么它是如何工作的?
答案 0 :(得分:4)
是的,它们是自动定义的,并且调用book.title
实际上正在调用book.getTitle()
请参阅http://groovy.codehaus.org/Groovy+Beans
您可以使用以下脚本查看此操作:
def debug( clazz ) {
println '----'
clazz.metaClass.methods.findAll { it.name.endsWith( 'Name' ) || it.name.endsWith( 'Age' ) }.each { println it }
}
class A {
String name
int age
}
debug( A )
// Prints
// public int A.getAge()
// public java.lang.String A.getName()
// public void A.setAge(int)
// public void A.setName(java.lang.String)
// Make name final
class B {
final String name
int age
}
debug( B )
// Prints
// public int B.getAge()
// public java.lang.String B.getName()
// public void B.setAge(int)
// Make name private
class C {
private String name
int age
}
debug( C )
// Prints
// public int C.getAge()
// public void C.setAge(int)
// Try protected
class D {
protected String name
int age
}
debug( D )
// Prints
// public int D.getAge()
// public void D.setAge(int)
// And public?
class E {
public String name
int age
}
debug( E )
// Prints
// public int E.getAge()
// public void E.setAge(int)
答案 1 :(得分:1)
几点说明:
this.@title
is
和get
前缀的getter。第4点的示例代码。
class A{
private int i = 0;
A(){
i = 4
println("Constructor has direct access. i = $i")
}
void setI(int val) { i = val; println("i is set to $i"); }
int getI(){i}
}
def a = new A() // Constructor has direct access. i = 4
a.i = 5 // i is set to 5
println a.i // 5
第4个音符很重要,如果你在访问器中有一些逻辑,并希望每次调用时都应用它。所以在构造函数中你应该显式调用setI()
方法!
7
的例子class A{
private int i = 0;
void setI(String val) { println("String version.")}
void setI(int val) { i = val; println("i is set to $i"); }
}
def a = new A()
a.i = 5 // i is set to 5
a.i = "1s5" // GroovyCastException: Cannot cast object '1s5' with class 'java.lang.String' to class 'int'
因此,我看到类似属性的访问使用第一个声明的访问器,并且不支持重载。也许稍后会修复。
答案 2 :(得分:0)
当且仅当不存在访问修饰符时,Groovy才会为字段生成公共访问器/ mutator方法。对于声明为public,private或protected的字段,将不会创建任何getter和setter。
对于声明为final的字段,只会创建访问者。
所有这些都类似地适用于静态字段。