2010-01-12 12 views
6

Tengo una enumeración que es privada, para no estar expuesta fuera de la clase. ¿Hay alguna forma en que pueda hacer una importación estática de ese tipo, para que no tenga que escribir el tipo de enumeración cada vez? ¿O hay una mejor manera de escribir esto? Ejemplo:¿Puedo hacer una importación estática de una subclase privada?

package kip.test; 

import static kip.test.Test.MyEnum.*; //compile error 

public class Test 
{ 
    private static enum MyEnum { DOG, CAT } 

    public static void main (String [] args) 
    { 
    MyEnum dog = MyEnum.DOG; //this works but I don't want to type "MyEnum" 
    MyEnum cat = CAT; //compile error, but this is what I want to do 
    } 
} 

Respuesta

3

¿O hay una mejor manera de escribir esto?

Si sus principales objetivos son hacer referencia a los artículos sin su identificador enumeración de clasificación, y mantener esta lista privada, que podría descartar el tipo enum por completo y usar constantes estáticas privadas ordinarias.

+4

no, enum proporciona otras formas de seguridad además de la mera encapsulación; por ejemplo, puede usarlas en instrucciones de cambio, y puede obtener advertencias si omite una. Simplemente mantente con el calificador: hay peores problemas de verbosidad en java;) – Chii

+0

@akf: Chii tiene razón, en mi código actual las enumeraciones tienen un comportamiento más allá de lo que se puede hacer trivialmente con las constantes estáticas. Simplemente simplifiqué todo eso para la pregunta, así que sería el mínimo ejemplo. Supongo que me quedé atrapado con nombres de calificador largos (mucho más que "MyEnum" en mi código real, por desgracia ...) – Kip

+0

@Kip: en este caso, ¿por qué aceptó esta respuesta? – Thilo

0

No, eso es más o menos de lo que se trata private.

+2

Por otro lado, la clase externa puede acceder directamente a todos los campos y métodos privados. Entonces, podría argumentarse para querer importarlo. – Thilo

1

Considerando que puede acceder al campo totalmente calificado, diría que es un error en el compilador (o especificación de idioma) que no puede importarlo estáticamente.

Sugiero que haga la enumeración protegida por paquete.

0

Simplemente podría escribir su código dentro de la enumeración en sí.

public enum MyEnum { 
DOG, CAT; 
public static void main(String[] args) { 
    MyEnum dog = MyEnum.DOG; // this works but I don't want to have to type 
           // MyEnum 
    MyEnum cat = CAT; // compile error, but this is what I want to do 
} 
} 

El otro lugar donde enumeraciones privados pueden ser referencias sin su clase está en una sentencia switch:

private static enum MyEnum { 
    DOG, CAT 
} 

public static void main(String[] args) { 
    MyEnum e = null; 
    switch (e) { 
    case DOG: 
    case CAT: 
    } 
} 
4

Puede utilizar el nivel de acceso sin modificador, es decir

enum MyEnum { DOG, CAT } 

MyEnum no será visible para las clases de otros paquetes ni de ninguna subclase. Es la forma más cercana de privacidad, pero le permite evitar referencias explícitas MyEnum.

2

Puede (o no) ser razonable mover parte del código a métodos (estáticos) de la enumeración.

Si se presiona, puede duplicar los campos estáticos en la clase externa.

private static final MyEnum CAT = MyEnum.CAT; 
private static final MyEnum DOG = MyEnum.DOG; 

Icky, pero una posibilidad.

+0

Sí, pensé en esto también. Supongo que es esto o simplemente usando el nombre calificado. Ninguno de los dos es ideal, pero creo que usar el nombre calificado será menos propenso a errores al menos. – Kip

Cuestiones relacionadas