Esta es más una cuestión de diseño. (Así que, No hay código. Podía código postal de la creación de una Enumeración y la asignación a null si me quieres hacerlo. :)) He estado pensando mucho sobre esto, pero últimamente no puede venir para arriba con una buena razón. La Enumeración de las constantes son implícitamente static y final. Enum es que quiere decir – «puedo tomar un valor de una de las constantes presentes en mí». Por qué permitir que la Enumeración tenga un valor null?. ¿Por qué no implícitamente por defecto la Enumeración de valor a un Enum.DEFAULT o Enum.None? No es este un mejor enfoque de lo que permite la Enumeración de ser null?

InformationsquelleAutor TheLostMind | 2014-04-14

5 Comentarios

  1. 45

    En primer lugar null significa la no existencia de una instancia. Proporcionando una constante predeterminada como DEFAULT o NONE, cambiar su significado. En segundo lugar, ¿por qué usted necesita algo predeterminado para representar lo que parece ser inexistente? Ese es el propósito de null. Básicamente, usted tiene que inicializar y almacenar un objeto adicional, que no debería existir en absoluto.

    Por CIERTO, no es una elección de idioma. Es totalmente de usted cómo implementar su enumeración. Usted puede proporcionar otra constante como DEFAULT, o UNKNOWN en su enumeración, y evitar la asignación de null a la referencia en el código. Este es famosamente conocido como Objeto Nulo Patrón. Pero decir que el null asignación debe ser en sí mismo error del compilador, entonces yo diría que, desde un Enum es que de todos modos se compila a un Class, por lo que sería perfectamente válido usar null para representar la no-existencia de una instancia.

    Una trampa de permitir que null aunque sea con el uso de enum en switch-case. El código de abajo, va a tirar NPE, incluso con un default caso:

    public class Demo {
        enum Color {
            WHITE, BLACK;
        }
    
        public static void main(String[] args) {
            Color color = null;
    
            switch (color) {    //NPE here
            case WHITE: break;
            case BLACK: break;
            default: break;     //null value does not fall into the default
            }
        }
    }

    Java no permite que un case null: tanto, producir el siguiente error de compilación:

    una enumeración interruptor caso de la etiqueta debe ser el nombre no calificado de una constante de enumeración

    • En el contarary, ¿qué sentido tendría a punto de un Enum a null cuando Enum se suponía que iba a tener un valor en sí mismo?. Oracle doc – Un tipo de enumeración es un tipo de datos especial que habilita para una variable a un conjunto de constantes predefinidas. La variable debe ser igual a uno de los valores que han sido predefinidos para él.
    • Creo que usted simplemente necesita para validar sus datos, debido a que el correo.g cuando los datos proceden de fuera de su sistema, usted no tiene garantizado el chico, que envía la solicitud, sabe cuáles son las consecuencias de usar el valor por defecto son.
    • no es un valor por defecto, pero un valor nulo se representa mediante un valor. Como vacía colecciones, por ejemplo. Objeto nulo patrón que se usa en las Enumeraciones.
    • Exactamente. Si un chico me envía null en lugar de que se espera una Enumeración constante, se debe lanzar una Excepción en tiempo de ejecución diciendo: – «se supone que para enviar una Enumeración constante». Permitiendo null, rompe con el diseño de lo que dice – «yo sé de qué valores puedo conseguir.» ( por supuesto que puedo comparar la calue con null. pero no me gusta hacerlo)
    • Todavía creo que la Enumeración no debe ser asignado a null. :). Creo que de Color color = null; // debería dar error de tiempo de compilación ( o en tiempo de ejecución si puedo obtener de forma dinámica.)
    • Es absolutamente una elección de idioma. Una lástima, que su respuesta no justifica en absoluto.
    • No estoy de acuerdo con la explicación y la lógica de esta respuesta.

  2. 4

    Creo, Enum.DEFAULT significa que su enumeración variable contiene un valor, pero null no. Si es null que se puede interpretar que no tiene ningún valor, no se puede invocar métodos no estáticos en él, por ejemplo.

    • En el contarary, ¿qué sentido tendría a punto de un Enum a null cuando Enum se suponía que iba a tener un valor en sí mismo?. Oracle doc – Un tipo de enumeración es un tipo de datos especial que habilita para una variable a un conjunto de constantes predefinidas. La variable debe ser igual a uno de los valores que han sido predefinidos para él.
    • porque enum variable es una referencia al objeto y se puede apuntar a nada (=variable vacía) o a uno de los valores de las enum.
  3. 2

    Puede agregar comportamiento a su enumeraciones (Domain Driven Design), por ejemplo para agregar un método público llamado prettyPrint() que devuelve una Cadena de valor de enumeración. Cómo un default /null es un valor que puede proporcionar una implementación de este método personalizado?

    Si quieres representar a null con una enumeración, entonces usted tendrá que explícita esta mediante el uso de un objeto nulo patrón manualmente con un valor NONE y una implementación personalizada para prettyPrint() basado en el valor NONE.

  4. 2

    Java permite que cualquier referencia a null, y las referencias a las enumeraciones no son tan especiales que un caso especial debe hacerse para prevenirlo, o para ofrecer otra versión de comportamiento que ya está bien especificado y que se entiende bien. Null ya es perfectamente adecuado valor de centinela: no necesitamos a otro uno.

    Ninguna de sus sugerencias es convincente, ya que ambos requieren de la adición de más características para el soporte de ellos.

    En cualquier caso, se trata de varios años es demasiado tarde para empezar a debatir sobre el punto.

    • Mi sugerencia podría ser incorrecta.sin embargo, nunca es demasiado tarde .. ejemplo de conmutación basado en Cadenas 😛
    • Por supuesto, es demasiado tarde. Nadie se va a introducir cambios en el lenguaje que no son compatibles con versiones anteriores.
    • Así las enumeraciones son lo suficientemente especial que ellos tienen su propia palabra clave, así que es un paso más para que el compilador para el tratamiento especial y vomitar sobre la configuración de uno a null (estoy de acuerdo con OP). La omisión aparece una arbitraria elección de diseño para mí. Es ortogonal si es o no la hará en el idioma.
    • La elección para preservar la compatibilidad hacia atrás es apenas «arbitraria».
  5. 0

    Viejo, lo sé. Estoy medio en Java.

    ¿Por qué permitir que la Enumeración tenga un valor null?

    Hay pocos casos de uso, creo. Por ejemplo, tenemos que inicializar una variable enum que nos diga que no es realmente parte de la enumeración, pero podemos cambiar su valor posterior, de modo que es parte de ella. Si no había manera de inicializar una variable enum como null, entonces tenemos que contaminan la definición enum. Así que, en mi opinión, campos, tales como la LibEnum.NONE suciedad de las bibliotecas. Por ejemplo, usted no desea utilizar LibEnum.NONE como parámetros de métodos, entre otros.

    Me pareció útil en mi léxico escáner, entre las palabras clave y punctuators. Supongamos que tienes un identificador "blah". A continuación desea comprobar si es la palabra clave.

    private Keywordv getKeywordValue(String id)
    {
        switch (id.length())
        {
            case 2:
            {
                switch (id)
                {
                    case "do": return Keywordv.DO;
                    case "if": return Keywordv.IF;
                    case "is": return Keywordv.IS;
    
                    //...
                }
    
                break;
            }
    
            //...
        }
    
        return null;
    }

    Gracias a null, es entonces fácil de verificar si el identificador no es una palabra clave.

    id == null

    De lo contrario, tendríamos que definir algo como Keywordv.__NULL

Dejar respuesta

Please enter your comment!
Please enter your name here