Groovy - 附加到列表,只能通过 getter-setter 使用



在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()

最新更新