将字节转换为枚举

时间:2011-04-04 17:56:43

标签: java enums casting byte

我有以下代码:


public enum PortableTypes { Boolean, etc...};

public void testConversion() {
  byte b = 5;
  PortableTypes type = (PortableTypes)b;
}

当我编译时,我被告知这些是不可转换的类型。我不知道像java这样简单的东西会被遗漏掉。我错过了什么,或者Java根本不支持转换为枚举?我也用int进行了测试,但失败了。

如果不支持,最简单的解决方法是什么?

编辑:

由于每个人都在抱怨“糟糕的设计”,我会进一步解释一下。我使用枚举来表示您可以使用我的TcpServer发送的类型。数据包以这种类型发送,在接收端我查看类型并使用它将从数据包读取的字节转换为可用数据。显然你不能使用OutputStream发送枚举,所以我需要将枚举值转换为要发送的数值。我不同意这是“糟糕的设计”的想法,我认为Enums确实应该用于这个目的,但是这种设计在Java中不起作用,因为它是强类型的。

8 个答案:

答案 0 :(得分:6)

你可能会认为enum就像我们在c / C ++或C#中所做的那样,它基本上是用于声明常量的语法糖。

Java enum是一个完全不同的野兽......它是Typesafe Enum pattern的内置实现。由于它是强类型的,因此无法直接从字节或整数中转换枚举。

但是所有枚举都是Java中的完整类,因此没有什么能阻止您实现为您进行转换的其他方法。

希望它有所帮助。

编辑:同样,我不是Java程序员,但我想这样的事情会起作用:

public enum PortableTypes {
    Boolean,
    Type2,
    Type3;

    public static PortableTypes convert(byte value) {
        return PortableTypes.values()[value];
    }        
};

public void testConversion() {
    byte b = 5;
    PortableTypes type = PortableTypes.convert(b);
}

让我知道它是否有效。

答案 1 :(得分:3)

Java enums有序可以帮助你。

要从常数变为数字,请致电WHATEVER.ordinal()。它以声明顺序返回常量的索引。所以,对于:

enum Underwear { BRIEFS, BOXERS };

Underwear.BRIEFS.ordinal()为0,Underwear.BOXERS.ordinal()为1。

要从一个数字到枚举对象,请调用values()并索引返回的数组。

这里的马口是:http://download.oracle.com/javase/6/docs/api/java/lang/Enum.html

答案 2 :(得分:2)

或写一个静态getter方法:

PortableTypes.get(b);

public static PortableTypes get(byte b) {
  return PortableTypes.values()[b];
}

答案 3 :(得分:2)

枚举被指定为一种类型(虽然它通常在持久性等中默认为int值...)它实际上有一个类型。更大的问题是你为什么要把它投下来,因为我一般会在“不良做法”下提出它。强打字是现代语言的一大优势。

如果您只需要在Java中读取枚举设计模式的字节值。

如果您需要该值,您可以执行以下操作:

enum SomeEnum
{
    a((byte)0x01),
    b((byte)0x02),
    c((byte)0x03),
    d((byte)0x04);

    byte byteVal;

    SomeEnum(byte b)
    {
      byteVal = b;
    }

    //Continued long winded example
    public MyNum replacementValueOf(byte b)
    {
      for(MyNum num : MyNum.values())
        if(b == num.getByte())
          return num;
      throw new RuntimeException("Your byte " + b + " was not a backing value for MyNum.");
    }
}

我正在给出一个深入的答案,但我同意上述帖子,重新考虑设计模式。

答案 4 :(得分:2)

您最有效的解决方案是使用ObjectOutputStream来回传递消息。出于多种原因,这很好。

  1. 内置enum序列化
  2. 更复杂的消息传递的可扩展性更顺畅
  3. 传入回调和参数的能力也已完成!

答案 5 :(得分:1)

我不确定这样做是个好主意。 你可以做PortableTypes.values()[b],但最好重新考虑设计。

答案 6 :(得分:1)

你可以尝试为你的枚举创建一个接受一个字节的方法。它可能看起来像这样:

public enum PortableTypes { 
    Boolean, //etc....
    Int;


    public statc PortableTypes fromByte(byte b) {

        for(PortableTypes t : values())
        {
            if(t.ordinal() == (int)b)
                return t;
        } 
        return null;  //or throw exception
    }
}

我现在没有IDE方便,但我相信这样的东西会起作用。希望这会有所帮助。

答案 7 :(得分:0)

如果类型实际上是派生类型,则只能从超类型转换为派生类型。枚举不是字节的种类,反之亦然。