Pregunta

Estoy usando Eclipse, y es perfectamente feliz con el siguiente código:

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

Sin embargo, la plataforma que estoy corriendo en accidentes en la línea marcada anteriormente. Por accidente, pensar en un equivalente de un BSOD. ¿Hay mal cualquier cosa con mi código, o tengo que perseguir los desarrolladores de la máquina virtual de Java para mi plataforma?


EDIT:

Ok, gracias por sus respuestas. Resultó ser un error en la máquina virtual de Java. En palabras del desarrollador, 'gloomyandy',

Este es un problema conocido con las interfaces que tienen un inicializador estático. Se fija en el desarrollo actual se basa ...

¿Fue útil?

Solución

No veo ningún problema con este código, aparte de que si está utilizando Java5 o superior, que sería mejor usar una enumeración:

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

Actualización: para volver a crear el valor de enumeración de su representación de bytes, es necesario MessageType suplemento con lo siguiente (adaptado de Effective Java, 2ª Ed artículo 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);
}

Otros consejos

Parece razonable ...

¿Qué pasa si usted toma los implementos "MessageType" fuera de su clase, ¿todavía cuelga?

El código en sí es perfectamente sano. Puedo compilar y ejecutar perfectamente bien en mi máquina Win7 (con java6); suena como que está utilizando algún sistema inusual?

Como todo el mundo dijo, debería funcionar.
Puede probar esto:

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

(MessageType no es necesario ya que la clase se lleve a la práctica).
Todavía preferiría la forma Péter Török sugirió.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top