tipo enumerados enum comparar java enums scjp ocpjp

enumerados - java 8 compare enum



¿Cómo no podemos comparar dos valores de enumeración con ''<''? (3)

Si la enumeración implementa Comparable, ¿por qué no se puede comparar con <o>?

public class Dream { public static void main(String... args) { System.out.println(PinSize.BIG == PinSize.BIGGER); //false System.out.println(PinSize.BIG == PinSize.BIG); //true System.out.println(PinSize.BIG.equals(PinSize.BIGGER));//false System.out.println(PinSize.BIG > PinSize.BIGGERER);// compilation error //can''t be compared System.out.println(PinSize.BIG.toString().equals(PinSize.BIGGER));// #4 PinSize b = PinSize.BIG ; System.out.println( b instanceof Comparable);// true } } enum PinSize { BIG, BIGGER, BIGGERER };


Implementar Comparable no significa que puedas usar < o > . Solo se pueden utilizar aquellos con valores numéricos.

Implementar Comparable significa que hay un compareTo() . Prueba esto:

System.out.println(PinSize.BIG.compareTo(PinSize.BIGGER));

El compareTo() devolverá un int que sea menor que, igual o mayor que 0, dependiendo de qué valor sea "más grande". En el caso de los valores de enum , el "tamaño" depende del orden de las definiciones de los valores de enumeración.


Las respuestas proporcionadas explican bien el problema, pero me gustaría agregar mis ideas, porque siento que no responden a la pregunta "¿por qué no se puede comparar con <o>"? El problema se reduce a comparar referencias. PinSize.BIGGEST y PinSize.BIGGERER son variables de referencia. Lo mismo que el siguiente:

String s; int[] array; MyObject myObject;

Representan direcciones en memoria. Además, las enumeraciones son singletons, por lo que siempre hay un objeto del tipo especificado. Debido a eso, la línea de abajo está permitida y devuelve verdadero.

System.out.println(PinSize.BIG == PinSize.BIG); //true

Tratar de verificar si una dirección en la memoria es mayor o menor que la otra dirección en la memoria es imposible. La implementación de la interfaz comparable y el método compareTo () brindan la oportunidad de proporcionar su propia forma personalizada de comparar objetos y direcciones en la memoria.

System.out.println(PinSize.BIG > PinSize.BIGGERER); // not possible


Puedes hacerlo:

PinSize.BIGGEST.ordinal() > PinSize.BIG.ordinal() // evaluates to `true`

Por supuesto, asumiendo que BIGGEST fue declarado después de BIG en la enumeración. El valor ordinal en una enumeración está ligado implícitamente al orden de declaración, de manera predeterminada, al primer valor se le asigna el valor 0 , el segundo valor 1 y así sucesivamente.

Así que si declaras la enumeración de esta manera, las cosas funcionarán:

public enum PinSize { SMALLEST, // ordinal value: 0 SMALL, // ordinal value: 1 NORMAL, // ordinal value: 2 BIG, // ordinal value: 3 BIGGER, // ordinal value: 4 BIGGEST; // ordinal value: 5 }