在Groovy类中,我想通过getters和setters将内部String
属性公开为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]
请考虑以下事项:
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
尝试使用以下代码,
Test t = new Test()
List list = t.getList()
list << 'd'
println list.dump()