是否有注释可以让groovy委托toString()
调用该类的特定字符串字段?
@Delegate
转换不会截获toString()
方法呼叫:
@TupleConstructor
class Person {
@Delegate
String name
}
println new Person('bdkosher') // prints "Person@62aa4b4b" instead of "bdkosher"
@ToString
方法也不是我要寻找的,因为它被放置在班级级别上,需要指定字段名称,并且在输出中包含类名称,例如
import groovy.transform.*
@ToString(includes='name')
@TupleConstructor
class Person {
String name
}
println new Person('bdkosher') // prints "Person(bdkosher)"
是否有注释可以让grovy委托toString()调用()呼叫到该类的特定字符串字段?
不是@delegate至少,因为有两个主要原因:
-
GroovyObject
接口的静态方法,合成方法或方法不是委托的候选(来自@delegate的技术说明)
示例:
import groovy.transform.*
@TupleConstructor
class Person {
@Delegate String name
}
//Cannot delegate to name because toString() from GroovyObject
//will take precedence over the delegation to name field.
println new Person('John')
- 在所有者类中定义的所有方法(包括静态,抽象或私有等)优先于@delegate字段相同签名的方法
示例:
import groovy.transform.*
//@ToString, @EqualsAndHashCode, @TupleConstructor implicit
@Canonical
class Person {
@Delegate String name
}
//Cannot delegate to name field because owner's (Person) toString()
//will take precedence over the delegation to name field.
println new Person('John')
我认为旧的方式很好:
import groovy.transform.*
@TupleConstructor
class Person {
String name
String toString() {
name
}
}
println new Person('John')