我有一个groovy枚举,其中包含一个将枚举值作为地图返回的方法,其中包含一些额外的逻辑。
以下是一个例子:
enum MyEnum {
CAT('feline', 'meow'),
DOG('canine', 'woof')
MyEnum(String animalType, String sound){
this.animalType = animalType
this.sound = sound
}
private final String animalType
private final String getAnimalType(){
animalType
}
private final String sound
private final String getSound(){
sound
}
def getMap(List animalsToReturn){
Map result = [:]
// do some stuff...
for (animal in animalsToReturn){
result.put(MyEnum.animal.animalType, MyEnum.animal.sound)
}
return result
}
}
myMap = MyEnum.getMap(['DOG'])
每当我调用MyEnum.getMap时,我都会收到错误消息,说方法签名不匹配。即使我让getMap在方法中有一个空签名和硬编码值作为测试。有任何想法吗?我在这里做错了什么?
答案 0 :(得分:4)
您需要使用static
方法。
static Map getMap(List animalsToReturn) {
Map result = [:]
// do some stuff...
for (animal in animalsToReturn){
MyEnum myEnum = MyEnum[animal]
result.put(myEnum.animalType, myEnum.sound)
}
result
}
上面应该可行,但是,有一种更简单的方法可以在Groovy中实现相同的结果。
static Map getMap(List animalsToReturn) {
animalsToReturn
.collect { MyEnum.valueOf it }
.collectEntries { [ it.animalType, it.sound ] }
}
或只是
animalsToReturn.collectEntries {
MyEnum myEnum = MyEnum[it]
[ myEnum.animalType, myEnum.sound ]
}
答案 1 :(得分:1)
getMap方法应该是静态的。
同样在animalsToReturn列表中使用String。我认为不使用" valueof"会更安全。或MyEnum [' DOG']。
试试这个:
static getMap(List animalsToReturn) {
MyEnum.values().findAll {
animalsToReturn.contains(it.toString())
}.collectEntries {
[(it.animalType): it.sound]
}
}