2 Stimmen

Dynamische Objektgraph-Navigation in Groovy

Leute! Ich möchte in der Lage sein, dynamisch im Groovy-Objektgraph zu navigieren und dabei den Pfad als Zeichenfolge zu haben:

def person = new Person("john", new Address("main", new Zipcode("10001", "1234")))
def path = 'address.zip.basic'

Ich weiß, dass ich auf eine Eigenschaft im Kartennotation zugreifen kann, aber es ist nur eine Ebene tief:

def path = 'address'
assert person[path] == address

Gibt es einen Weg, einen tieferen Pfad auszuwerten?

Danke!

0 Stimmen

1voto

Gergely Toth Punkte 6146

Dies kann erreicht werden, indem der getAt-Operator überschrieben und der Eigenschaftsgraph traversiert wird. Der folgende Code verwendet Groovy Category, aber Vererbung oder Mixins könnten auch verwendet werden.

class ZipCode {
    String basic
    String segment

    ZipCode(basic, segment) {
        this.basic = basic
        this.segment = segment
    }
}

class Address {
    String name
    ZipCode zip

    Address(String name, ZipCode zip) {
        this.name = name
        this.zip = zip
    }
}

class Person {
    String name
    Address address

    Person(String name, Address address) {
        this.name = name
        this.address = address
    }

}

@Category(Object)
class PropertyPath {

    static String SEPARATOR = '.'

    def getAt(String path) {

        if (!path.contains(SEPARATOR)) {
            return this."${path}"
        }

        def firstPropName = path[0..path.indexOf(SEPARATOR) - 1]
        def remainingPath = path[path.indexOf(SEPARATOR) + 1 .. -1]
        def firstProperty = this."${firstPropName}"
        firstProperty[remainingPath]
    }
}

def person = new Person('john', new Address('main', new ZipCode('10001', '1234')))

use(PropertyPath) {
    assert person['name'] == 'john'
    assert person['address.name'] == 'main'
    assert person['address.zip.basic'] == '10001'
}

PropertyPath.SEPARATOR = '/'
use(PropertyPath) {
    assert person['address/zip/basic'] == '10001'
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X