Groovy:AST转换以将ToString调用委托到字符串字段



是否有注释可以让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')

相关内容

最新更新