Grails String для перечисления?

Предположим, у меня есть это перечисление:

public enum MyEnum {
    AUSTRALIA_SYDNEY ("Australia/Sydney"),
    AUSTRALIA_ADELAIDE ("Australia/Adelaide"),

    private String name

    private Timezone(String name){
        this.name = name
    }

    public String value() {
        name
    }

    String toString() {
        name
    }
}

Есть ли способ для меня, чтобы получить enum, используя его значение / имя? Прямо сейчас я пытаюсь сделать это, но это не работает:

MyEnum.valueOf("Australia/Sydney")

То, что я получаю из БД, это строка (в данном случае: "Австралия / Сидней"), а не значение, и, к сожалению, я не могу просто изменить тип, который он возвращает, потому что это старая система, и я просто подключается к этой БД, которая используется несколькими приложениями. Во всяком случае вокруг этого?

4 ответа

Решение

Добавьте следующее в ваше перечисление:

static MyEnum valueOfName( String name ) {
    values().find { it.name == name }
}

Затем вы можете позвонить:

MyEnum.valueOfName( "Australia/Adelaide" )

Для полноты, чтобы добавить к предыдущим ответам здесь есть дополнительные опции, которые объединяют пост, на который ссылается г-н Хаки. Этот ответ взят из блога Амита Джайна: http://www.intelligrape.com/blog/groovy-few-ways-to-convert-string-into-enum/

enum AccountType {
     CHECKING,
     SAVING
}

assert AccountType.CHECKING == "CHECKING" as AccountType

assert AccountType.CHECKING == AccountType.valueOf("CHECKING")
def className = AccountType.class
assert AccountType.CHECKING == Enum.valueOf(className, "CHECKING")

assert AccountType.CHECKING == AccountType["CHECKING"]
String type = "CHECKING"
assert AccountType.CHECKING == AccountType[type]

Со ссылкой на блог http://mrhaki.blogspot.ae/2010/12/groovy-goodness-transform-string-into.html есть несколько способов конвертировать String в Enum.

enum Compass {
    NORTH, EAST, SOUTH, WEST
}

// Coersion with as keyword.
def north = 'NORTH' as Compass
assert north == Compass.NORTH

// Coersion by type.
Compass south = 'south'.toUpperCase()
assert south == Compass.SOUTH

def result = ['EA', 'WE'].collect {
    // Coersion of GString to Enum.
    "${it}ST" as Compass
}
assert result[0] == Compass.EAST
assert result[1] == Compass.WEST
assert AccountType.CHECKING == "CHECKING" as AccountType
Другие вопросы по тегам