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

ただし、実行しているプラ​​ットフォームは、上記の行でクラッシュします。クラッシュによって、BSOD に相当すると考えてください。私のコードに何か問題がありますか? それとも、私のプラットフォーム用の 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, 2nd Ed. Item 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

コード自体は完全に健全です。Win7マシン(Java6を使用)で完全にコンパイルして実行できます。何か変わったシステムを使っているようですね?

于 2010-05-09T15:10:09.620 に答える
1

合理的に見える...

クラスから "implements MessageType" を削除してもクラッシュしますか?

于 2010-05-09T15:03:51.537 に答える
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 に答える