Groovy枚举-调用链

Groovy枚举-调用链,groovy,enums,chain,Groovy,Enums,Chain,我很惊讶地看到将调用链接到enum是有效的。我碰巧有一个名为“name”的枚举实例,当我忘记括号时,引用了该实例而不是name()。枚举是否应允许链接调用? 使用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

我很惊讶地看到将调用链接到enum是有效的。我碰巧有一个名为“name”的枚举实例,当我忘记括号时,引用了该实例而不是name()。枚举是否应允许链接调用? 使用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

这是正确的。在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

FWIW,Java表现出相同的行为。