在Groovy脚本中导入内部枚举

时间:2015-09-24 07:46:13

标签: groovy import enums static inner-classes

我在"invoke failed!service[%s],errno[%d],desc[%s]" 中定义了一个包含一些内部枚举的Groovy类:

Vehicles.groovy

我想在public class Vehicles { public enum Land { BICYCLE, CAR, TRAIN } public enum Water { SAILBOAT, MOTORBOAT } public enum Air { JET, HELICOPTER } } 的同一目录中的脚本run.groovy中引用这些枚举。

完全限定枚举实例。

Vehicles.groovy

import Vehicles
println Vehicles.Land.BICYCLE

import static Vehicles.Land
println Vehicles.Land.BICYCLE

正确打印import Vehicles.Land.* println Vehicles.Land.BICYCLE

但是,我想在没有完全限定的情况下引用BICYCLE枚举。

我基本上尝试了静态/非静态,别名/非别名以及星/非星级导入的每种组合。

Landimport Vehicles.Land(或import static Vehicles.Land.*)会出现import Vehicles.Land as Land错误。这看起来很奇怪,因为他们会用Java做什么(如果我错了,请纠正我。)

如果我尝试

unable to resolve class

import static Vehicles.Land
println Land.BICYCLE

import static Vehicles.Land as Land
println Land.BICYCLE

,我收到错误

import Vehicles.Land.*
println Land.BICYCLE

类似地,

Caught: groovy.lang.MissingPropertyException: No such property: Land for class: run
groovy.lang.MissingPropertyException: No such property: Land for class: run
        at run.run(run.groovy:2)

给出

import Vehicles.Land.*
println BICYCLE

Caught: groovy.lang.MissingPropertyException: No such property: BICYCLE for class: run groovy.lang.MissingPropertyException: No such property: BICYCLE for class: run at run.run(run.groovy:2) Vehicles.groovy添加包声明似乎也无济于事。

因此...

  • Groovy对导入内部类有什么支持?为什么它与Java不同?
  • 如何让Groovy允许我引用非完全限定的内部枚举?

注意:我使用的是Groovy 1.8.6和Oracle JDK 1.8.0_45。

2 个答案:

答案 0 :(得分:3)

你在下面试过吗?

import static Vehicles.Land.*

println BICYCLE
编辑:这就是你要找的东西吗?

答案 1 :(得分:1)

Groovy确实支持导入嵌套类,包括枚举。但是,如果要访问它们而没有完全资格,则需要以非静态方式(与Java不同)导入它们,或者明确地声明它们为静态:

// Explicitly declare Water and Air as static to demonstrate
public class Vehicles {
  public enum Land { BICYCLE, CAR, TRAIN }
  public static enum Water { SAILBOAT, MOTORBOAT }
  public static enum Air { JET, HELICOPTER }
}

// Non-static nested enum needs non-static import (unlike Java)
import Vehicles.Land
println Land.BICYCLE

// Explicitly static nested enum can be static imported
import static Vehicles.Water
println Water.SAILBOAT

// Explicitly static nested enum can also be non-static imported as well!
import Vehicles.Air
println Air.JET

工作示例:https://groovyconsole.appspot.com/script/5089946750681088

与Java enums are implicitly static不同的是,Groovy中的枚举似乎不是不是隐式静态的,因此为什么静态导入不起作用。这是因为Groovy中的枚举实际上与Java中的枚举不同,因此它们的名称为enhancements。不幸的是,它们似乎忘记了告诉编译器也将它们隐式地设置为静态(至少从2.4.4开始)。

我的建议是(如果可以的话)显式地声明它们为静态的,这与Groovy认为有效的Java是有效的Groovy的想法保持一致。