【问题标题】:Grails String to enum?Grails字符串到枚举?
【发布时间】:2013-09-16 08:32:02
【问题描述】:

假设我有这个枚举:

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
    }
}

有没有办法让我使用枚举的值/名称来获取枚举? 现在,我正在尝试这样做,但它不起作用:

MyEnum.valueOf("Australia/Sydney")

我从数据库中得到的是一个字符串(在这种情况下:“Australia/Sydney”),而不是值,不幸的是,我不能只更改它返回的类型,因为它是旧的 系统,我只是连接到这个由多个应用程序共享的数据库。无论如何围绕这个?

【问题讨论】:

    标签: grails groovy


    【解决方案1】:

    将以下内容添加到您的枚举中:

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

    然后,你可以调用:

    MyEnum.valueOfName( "Australia/Adelaide" )
    

    【讨论】:

    • 尽管有其他所有动态查找器,但 Grails 没有这个!把它加到我的包里 o' 技巧 ;)
    • @CharlesWood 确实如此!请参阅 drin 对此问题的回答。
    • 感谢@AlexanderSuraphel,但这实际上仍然不是问题所在。请仔细看问题中的枚举和dbrin的答案中的枚举之间的区别。
    • @CharlesWood 你是对的。我应该看得够仔细的!
    【解决方案2】:

    为了完整地添加到以前的答案,这里是其他选项,它们结合了 Haki 先生引用的帖子。这个答案取自 Amit Jain 的博客文章: 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]
    

    【讨论】:

      【解决方案3】:

      参考博客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
      

      【讨论】:

      • 不幸的是,他的值打印得很漂亮,所以它更像'Australia/Sydney'.toUpperCase().replace('/','_'),其中 1) 是笨拙的内联,2) 是 tightly coupled。任何使用枚举的代码都必须知道值的格式,并且如果格式发生变化,则需要更新。
      【解决方案4】:
      assert AccountType.CHECKING == "CHECKING" as AccountType
      

      【讨论】:

        猜你喜欢
        • 2011-11-02
        • 2021-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多