Перечисления Groovy — цепочки вызовов

Я удивлен, увидев, что цепочка вызовов перечисления работает. У меня был экземпляр перечисления под названием «имя», и на него ссылались вместо имени (), когда я забыл скобки. Должны ли перечисления разрешать цепочку вызовов? Использование Groovy 2.4.10 — см. последние 3 вызова ниже:

Groovy Shell (2.4.10, JVM: 1.8.0_121)
Type ':help' or ':h' for help.

groovy:000> public enum Compass { north, south }
===> true
groovy:000> Compass.north
===> north
groovy:000> Compass.north.name
ERROR groovy.lang.MissingPropertyException:
No such property: name for class: Compass
groovy:000> Compass.north.name()
===> north
groovy:000> public enum Compass { north, south, name }
===> true
groovy:000> Compass.north.name()
===> north
groovy:000> Compass.north.name
===> name
groovy:000> Compass.north.south
===> south
groovy:000> Compass.north.south.north
===> north

person Bimal Shah    schedule 05.06.2017    source источник
comment
FWIW, Java демонстрирует такое же поведение.   -  person Oliver Charlesworth    schedule 05.06.2017


Ответы (1)


Это правильно. Перечисления в Java — это синтаксический сахар (плюс полезные вещи, такие как values() и name()) над статическими полями в том же классе, поэтому, когда вы вызываете поле перечисления, у вас также есть статическая ссылка на этот класс, который также имеет доступ к поля другого класса:

class Compass {
    static NORTH = new Compass()
    static SOUTH = new Compass()
}


assert Compass.NORTH.SOUTH.NORTH == Compass.NORTH

def west = new Compass()
assert west.SOUTH == Compass.SOUTH
person Will    schedule 05.06.2017