在Groovy类中,我希望通过getter和setter将内部String属性公开为List。我希望该属性的行为就像一个常规的list属性,我可以使用obj.list << newElement向该属性添加元素。然而,它不工作,我必须使用工作-周围的obj.list = obj.list << newElement。
在Groovy中还有其他方法可以完成这个任务吗?要在类中实现的方法,在使用<<运算符时将被调用?
代码示例:
class Test {
String internal = 'a,b,c'
List getList() {
return internal .split(',')
}
void setList(List list) {
internal = list.join(',')
}
}
def t = new Test()
println t.internal // a,b,c
println t.list // [a, b, c]
t.list << 'd' // this does not work! does not add new element
println t.list // [a, b, c]
t.list = t.list << 'd' // work-around that works
println t.list // [a, b, c, d]发布于 2017-11-02 15:40:06
请考虑以下几点:
class Test {
String internal = 'a,b,c'
List getList() {
def list = internal.split(',') as List
// this will override so:
// << 'd' becomes appendToList(['d'])
// << ['e','f'] becomes appendToList(['e','f'])
list.metaClass.leftShift = { def x ->
this.appendToList([x].flatten())
}
return list
}
void appendToList(List list) {
internal = internal + "," + list.join(',')
}
void setList(List list) {
internal = list.join(',')
}
}注它处理以下两种情况:(a)一项(b)一项清单
def t = new Test()
t.list << 'd'
assert ['a','b','c','d'] == t.list
t.list << ['e','f']
assert ['a','b','c','d','e','f'] == t.list
t.list = ['x','y']
assert ['x', 'y'] == t.list发布于 2017-11-02 14:18:10
尝试使用以下代码,
Test t = new Test()
List list = t.getList()
list << 'd'
println list.dump()https://stackoverflow.com/questions/47077223
复制相似问题