¿Puedo especificar ordinal para enumeración en Java?

3 minutos de lectura

avatar de usuario
comer

los ordinal() El método devuelve el ordinal de una instancia de enumeración.
¿Cómo puedo establecer el ordinal para una enumeración?

avatar de usuario
Mate

Puede controlar el ordinal cambiando el orden de la enumeración, pero no puede configurarlo explícitamente como en C++. Una solución es proporcionar un método adicional en su enumeración para el número que desea:

enum Foo {
  BAR(3),
  BAZ(5);
  private final int val;
  private Foo(int v) { val = v; }
  public int getVal() { return val; }
}

En esta situación BAR.ordinal() == 0pero BAR.getVal() == 3.

  • +1 excepto que esto no es una solución, de verdad. es el comportamiento deseado. el valor ordinal se considera un artefacto de implementación; si desea asignar un número entero u otro valor, eso es lo que “las enumeraciones son clases” es tan bueno …

    – andersoj

    21 de marzo de 2011 a las 1:43

  • no BAR.ordinal () devuelve 0 afaik los índices de enumeración están basados ​​​​en cero

    – Terraego

    10 de marzo de 2012 a las 14:59

avatar de usuario
Bozho

No puedes configurarlo. Siempre es el ordinal de la definición constante. Ver el documentación para Enum.ordinal():

Devuelve el ordinal de esta constante de enumeración (su posición en su declaración de enumeración, donde a la constante inicial se le asigna un ordinal de cero). La mayoría de los programadores no tendrán ningún uso para este método. Está diseñado para ser utilizado por estructuras de datos sofisticadas basadas en enumeraciones, como EnumSet y EnumMap.

Y en realidad, no deberías necesitarlo. Si desea alguna propiedad entera, defina una.

  • Si puedo especificar el ordinal de enumeración, cuando use JPA con enumeración, será más seguro…

    – Cocinar

    21 de marzo de 2011 a las 14:18

avatar de usuario
balbucear

Como señala la respuesta aceptada, no puede establecer el ordinal. Lo más cerca que puedes llegar a esto es con una propiedad personalizada:

public enum MonthEnum {

    JANUARY(1),
    FEBRUARY(2),
    MARCH(3),
    APRIL(4),
    MAY(5),
    JUNE(6),
    JULY(7),
    AUGUST(8),
    SEPTEMBER(9),
    OCTOBER(10),
    NOVEMBER(11),
    DECEMBER(12);

    MonthEnum(int monthOfYear) {
        this.monthOfYear = monthOfYear;
    }

    private int monthOfYear;

    public int asMonthOfYear() {
        return monthOfYear;
    }

}

Nota: Por defecto, enum valores comienzan en 0 (no 1) si no especifica valores. Además, los valores no tienen que incrementarse en 1 para cada artículo.

De http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html

public final int ordinal() Devuelve el ordinal de esta constante de enumeración (su posición en su declaración de enumeración, donde a la constante inicial se le asigna un ordinal de cero). La mayoría de los programadores no tendrán ningún uso para este método. Está diseñado para ser utilizado por estructuras de datos sofisticadas basadas en enumeraciones, como EnumSet y EnumMap.

Devuelve: el ordinal de esta constante de enumeración

Si usted tiene

public enum Día { DOMINGO, LUNES, MARTES, MIÉRCOLES, JUEVES, VIERNES, SÁBADO }

entonces el DOMINGO tiene un ordinal de 0, el LUNES es 1, y así sucesivamente…

  • Si está dispuesto a hacer esto, también podría reordenar los campos de enumeración. Es más fácil, más seguro y más legible.

    – gili

    1 de febrero de 2019 a las 21:32

Echa un vistazo a Java Ejemplos de enumeración y documentos

Devuelve el ordinal de esta constante de enumeración (su posición en su declaración de enumeración, donde a la constante inicial se le asigna un ordinal de cero). La mayoría de los programadores no tendrán ningún uso para este método. Está diseñado para ser utilizado por estructuras de datos sofisticadas basadas en enumeraciones, como EnumSet y EnumMap.

avatar de usuario
donnyton

La respuesta fácil: simplemente cambie el orden de las constantes. El primero definido será 0, el segundo será 1, etc. Sin embargo, esto puede no ser práctico si tiene un código que cambia constantemente o las enumeraciones tendrán muchos valores. Puede definir un método personalizado para evitar el ordinal predeterminado, ¡pero ASEGÚRESE de que esté bien documentado para evitar confusiones!

public enum Values
{
    ONE, TWO, THREE, FOUR;

    public int getCustomOrdinal()
    {
        if(this == ONE)
        {
            return 3;
        }
        else if(this == TWO)
        {
            return 0;
        }
        ...
    }
}

¿Ha sido útil esta solución?