【问题标题】:Converting from different values to Enum value从不同的值转换为枚举值
【发布时间】:2017-01-18 22:02:21
【问题描述】:

我的应用程序获取需要转换为相应枚举值的外部数据。这是我的第一个方法:

public enum Side {
    LEFT,
    RIGHT;

    public static Side fromByte(Byte b) throws Exception {
        switch(b)
        {
            case 'l':
                return LEFT;
            case 'r':
                return RIGHT;
            default:
                throw new Exception("not a valid byte");
        }
    }
}

这样可以吗,还是有更惯用的方法来做到这一点?

注意:忽略字节到字符的比较和非常通用的异常抛出,我稍后会研究——尤其是字符和字节类型的转换。似乎比我最初预期的要大。

【问题讨论】:

  • 如果你不检查null,为什么参数是Byte而不是byte
  • @Andreas 我从一些生成的 JNA 代码中获取参数并返回 Byte
  • 如果你有一个Byte 并且需要一个byte,Java 会自动拆箱,所以不要让这个方法的契约依赖于你的调用者如何获得它的价值。如果其他调用者有byte 并且想要调用此方法,则您将强制编译器在调用时将其装箱,只是在switch 语句的方法内将其拆箱。更改为byte,如果调用者有byte,则不会发生装箱/拆箱。简而言之,取你想要的价值,而不是你的调用者可能拥有的价值。
  • 很高兴知道,我现在就去做!
  • @SMA 使用 map 意味着额外的内存。虽然如果有大量的情况应该考虑Map

标签: java enums


【解决方案1】:

方法看起来不错。但是,如果有可能出现大量情况,请考虑使用 map(在您的情况下实现可以是 HashMap),因为它更具可读性和更少的代码。

【讨论】:

    【解决方案2】:

    我通常会选择这样的东西,

    public enum Side
    {
        LEFT('l'),
        RIGHT('r');
    
        private byte byteValue;
    
        private Side(byte byteValue)
        {
            this.byteValue = byteValue;
        }
    
        public byte getByteValue()
        {
            return byteValue;
        }
    
        public static Side findByByteValue(byte value)
        {
            for(Side side : values())
            {
                if(side.byteValue == value)
                {
                    return side;
                }
            }
            return null;
        }
    }
    

    【讨论】:

    • 注意 LEFT 和 RIGHT 的 byteValue 不是字节,您需要将它们更改为它们的字节值或预先处理转换并将 byteValue 更改为 char。
    • 我喜欢这种方法!如果您有多个不同的来源(假设字符 'r' 和 'l' 以及整数 0(左)和 1(右)),你会像我上面那样做吗,或者你会执行一些转换并使用一种常见的类型作为存储?
    • 我将不得不在 Stackoverflow 上的某处查看转换为字节的情况。我通过 JNA 绑定从 C API 获取值。一个 char 在那里有 8 位,然后在 Java 端将其转换为 Byte 对象。也许我可以简单地使用 ascii 值而无需做一些花哨的转换,因为我只需要 'l' 和 'r' 反正。
    • 我不太确定你在问什么,但如果你想分别在 LEFT 和 RIGHT 中添加 0 和 1,你可以这样做,LEFT('l', 0), RIGHT('r', 1) 然后添加一个 int 字段, private int intValue 和一个 getter 和 int 值的查找方法。
    • 是的,这就是我的意思。与 C++ 相比,Java 枚举是如此强大,我仍然不认为它们是类。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 2012-11-12
    相关资源
    最近更新 更多