Ещё немножко Groovy магии

· На чтение уйдёт 2 минут · (248 слов)

Я уже писал, что считаю Groovy одним из самых перспективных языков программирования и даже приводил тому примеры.

Но этот разговор не имеет ни начала ни конца, и интересные примеры всегда могут придумываться «по ходу дела». Так, например, подвернулся такой код на Groovy:

string = 'hippopotamus'
assert string - 'hippo' - 'mus' + 'to' == 'potato'

Считаю, что это просто гениально :) Когда-то давным-давно, когда я ещё учился в школе и ничего толком программировать не умел, я ушёл с Basic к Pascal из-за более качественной работы со строками. Ах, если бы в то время существовали такие прикольные штуки, как Groovy или хотя бы Java!

А ещё я хотел бы рассказать про конструкторы. Конструкторы в Groovy бывают очень-очень разными. Можно написать так:

def a = new A();
a.setB(b);
a.setC(c);

Можно и так:

def a = new A(b: b, c: c);

А можно даже так:

@Newify(A){def a = A(b:b,c:c)}

Если непонятно, зачем нужен @Newify, сравните:

def buildTree() {
    new Tree(new Tree(new Leaf(1), new Leaf(2)), new Leaf(3))
}

Казалось бы, всё нормально. Но есть способ и короче (вроде бы, заимствованный из Python):

@Newify([Tree, Leaf]) buildTree() {
    Tree(Tree(Leaf(1), Leaf(2)), Leaf(3))
}

Или ещё пример от авторов языка:

@Immutable final class Coordinates {
    Double latitude, longitude
}
@Immutable final class Path {
    Coordinates[] coordinates
}
@Newify([Coordinates, Path])
def build() {
    Path(
        Coordinates(48.824068, 2.531733),
        Coordinates(48.857840, 2.347212),
        Coordinates(48.858429, 2.342622)
    )
}
assert build().coordinates.size() == 3

Как видно, мы не пишем конструкторов! Всё просто работает. А ещё мы не пишем слово new. И всё снова просто работает.

Полезное