سؤال
أنا أستخدم 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
ليس هناك حاجة لأن الفصل ينفذها).
ما زلت أفضل الطريقة اقترح بيتر توروك.