2

我正在使用 Eclipse,它对以下代码非常满意:

public interface MessageType
{
    public static final byte   KICK     = 0x01;
    public static final byte   US_PING  = 0x02;
    public static final byte   GOAL_POS = 0x04;
    public static final byte   SHUTDOWN = 0x08;
    public static final byte[] MESSAGES = new byte[] {
        KICK,
        US_PING,
        GOAL_POS,
        SHUTDOWN
    };
}

public class MessageTest implements MessageType
{
    public static void main(String[] args)
    {
        int b = MessageType.MESSAGES.length;    //Not happy
    }
}

但是,我正在运行它的平台在上面标记的行处崩溃。通过崩溃,想想相当于一个蓝屏死机。我的代码有什么问题,还是我需要为我的平台寻求 Java VM 的开发人员?


编辑:

好的,谢谢您的回复。原来是 Java VM 中的一个错误。引用开发者的话,'gloomyandy',

这是具有静态初始化程序的接口的一个已知问题。它已在当前的开发版本中修复...

4

4 回答 4

3

我认为这段代码没有任何问题,除了如果你使用的是 Java5 或更高版本,你最好使用枚举:

public enum MessageType
{
    KICK     (0x01),
    US_PING  (0x02),
    GOAL_POS (0x04),
    SHUTDOWN (0x08);

    private byte value;
    MessageType(byte value) { this.value = value; }
    byte getValue() { return value; }
}

public class MessageTest
{
    public static void main(String[] args)
    {
        int b = MessageType.values().length;    //Should be happy :-)
    }
}

更新:要从其字节表示重新创建枚举值,您需要补充MessageType以下内容(改编自 Effective Java,第 2 版。第 31 条):

private static final Map<Byte, MessageType> byteToEnum = new HashMap<Byte, MessageType>();

static { // Initialize map from byte value to enum constant
  for (MessageType type : values())
    byteToEnum.put(type.getValue(), type);
}

// Returns MessageType for byte, or null if byte is invalid
public static MessageType fromByte(Byte byteValue) {
  return byteToEnum.get(byteValue);
}
于 2010-05-09T15:04:36.427 回答
1

似乎有道理...

如果你把“implements MessageType”从你的课堂上拿走,它还会崩溃吗?

于 2010-05-09T15:03:51.537 回答
1

代码本身非常合理。我可以在我的 Win7 机器(使用 Java6)上完美地编译和运行它;听起来你正在使用一些不寻常的系统?

于 2010-05-09T15:10:09.620 回答
0

正如大家所说,它应该工作。
你可以试试这个:

public class MessageTest implements MessageType
{
    public static void main(String[] args)
    {
        int b = MESSAGES.length;    // no MessageType here
    }
}

MessageType不需要,因为该类正在实现它)。
我仍然更喜欢Péter Török 建议的方式。

于 2010-05-10T09:41:40.120 回答