Это действительный код Java?
Вопрос
Я использую 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 или выше, вам было бы лучше использовать Enum:
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
Со следующим (адаптированным от эффективной 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);
}
Другие советы
Кажется разумным ...
Что делать, если вы возьмете «реализует MessageType» от вашего класса, он все еще сбой?
Сам код прекрасно звучит. Я могу компилировать и запустить его отлично в моей машине Win7 (с Java6); Похоже, вы используете некоторую необычную систему?
Как все сказали, он должен работать.
Вы можете попробовать это:
public class MessageTest implements MessageType
{
public static void main(String[] args)
{
int b = MESSAGES.length; // no MessageType here
}
}
(MessageType
не нужен, так как класс реализует его).
Я все еще предпочел бы путь Péter Török предложил.