سؤال

أنا أستخدم 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. على حد تعبير المطور ، "القاتم" ،

هذه مشكلة معروفة مع الواجهات التي لها مُهيئ ثابت. تم إصلاحه في تطوير التطوير الحالي ...

هل كانت مفيدة؟

المحلول

لا أرى أي مشكلة في هذا الرمز ، بخلاف ذلك إذا كنت تستخدم 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 مع ما يلي (مقتبس من جافا الفعالة ، الطبعة الثانية. البند 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);
}

نصائح أخرى

يبدو معقولا...

ماذا لو قمت بإيقاف "تنفيذ 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