質問

私は 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」の言葉を借りれば、

これは、静的初期化子を持つインターフェイスに関する既知の問題です。現在の開発ビルドでは修正されています...

役に立ちましたか?

解決

このコードには何の問題もありません。ただし、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 :-)
    }
}

アップデート: enum 値をそのバイト表現から再作成するには、以下を補足する必要があります。 MessageType 以下のとおりです (Effective Java, 2nd Ed. から改変)項目 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);
}

他のヒント

合理的だと思われます...

クラスから「implements MessageType」を削除した場合でも、クラッシュは発生しますか?

コード自体は完全に健全です。私の Win7 マシン (Java6 搭載) では、まったく問題なくコンパイルして実行できます。何か珍しいシステムを使っているようですね?

誰もが言ったように、それはうまくいくはずです。
これを試すことができます:

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

(MessageType クラスが実装しているため必要ありません)。
私はまだ好きです ペーター・トロク氏はこう提案した。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top