Reflection 反映实例方法的惯用Groovy方式是什么?
下面是一些问题的示例代码Reflection 反映实例方法的惯用Groovy方式是什么?,reflection,groovy,Reflection,Groovy,下面是一些问题的示例代码 class Foo { String a() String b() } Bar的初始版本 class Bar { List<Foo> foos = new ArrayList<Foo>() String getAs() { def builder = new StringBuilder() foos.each { builder.append it.a() builder.ap
class Foo {
String a()
String b()
}
Bar的初始版本
class Bar {
List<Foo> foos = new ArrayList<Foo>()
String getAs() {
def builder = new StringBuilder()
foos.each {
builder.append it.a()
builder.append System.getProperty("line.separator")
}
builder.toString()
}
String getBs() {
def builder = new StringBuilder()
foos.each {
builder.append it.b()
builder.append System.getProperty("line.separator")
}
builder.toString()
}
}
类栏{
List foos=new ArrayList()
字符串getAs(){
def builder=新的StringBuilder()
每人{
builder.append.a()
builder.append System.getProperty(“line.separator”)
}
builder.toString()
}
字符串getBs(){
def builder=新的StringBuilder()
每人{
builder.append.b()
builder.append System.getProperty(“line.separator”)
}
builder.toString()
}
}
很明显,我想重构这个。我目前有:
class Bar {
List<Foo> foos = new ArrayList<Foo>()
String getAs() {
collectSections "a"
}
String getBs() {
collectSections "b"
}
private String collectSections(String method) {
def builder = new StringBuilder()
foos.each {
builder.append it."${method}"()
builder.append System.getProperty("line.separator")
}
builder.toString()
}
}
类栏{
List foos=new ArrayList()
字符串getAs(){
“a”部分
}
字符串getBs(){
“b”部分
}
私有字符串(字符串方法){
def builder=新的StringBuilder()
每人{
builder.append它。“${method}”()
builder.append System.getProperty(“line.separator”)
}
builder.toString()
}
}
这是groovy最好的方法吗?我会这样做,因为它抽象了收集算法并使用标准的groovy收集操作方法
class Bar {
List<Foo> foos = new ArrayList<Foo>()
String collect(values) {
values.inject(new StringBuilder()) { b, val ->
b << val + System.getProperty("line.separator")
}.toString()
}
String getAs() {
collect foos*.a()
}
String getBs() {
collect foos*.b()
}
}
类栏{
List foos=new ArrayList()
字符串收集(值){
values.inject(新的StringBuilder()){b,val->
b我们可以完全取消collect,只需执行foos*.a().join(System.getProperty(“line.separator”))即可,但请记住,join不会包含最后一个分隔符。如果您同意,那么是的,它甚至更好。