2010-01-12 9 views
6

Ho un enum che è privato, non deve essere esposto al di fuori della classe. Posso comunque fare un'importazione statica di quel tipo, in modo che non debba digitare il tipo di enumerazione ogni volta? O c'è un modo migliore per scrivere questo? Esempio:Posso eseguire un'importazione statica di una sottoclasse privata?

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

risposta

3

Oppure c'è un modo migliore per scrivere questo?

Se i vostri obiettivi principali sono quelli di riferimento gli articoli senza il loro identificatore qualificazione enum, e mantenere questa lista in privato, si potrebbe rottami il tipo enum del tutto e uso ordinario costanti statiche privati.

+4

no, enum fornisce altre forme di sicurezza diverse dalla semplice incapsulamento: ad esempio, è possibile utilizzarle nelle istruzioni switch e si possono ricevere avvisi se ne si omette uno. Basta attenersi alla qualifica - ci sono problemi di verbosità peggiori in java;) – Chii

+0

@akf: Chii ha ragione, nel mio codice attuale le enumerazioni hanno un comportamento al di là di ciò che può essere banalmente fatto con costanti statiche. Ho solo semplificato tutto questo per la domanda, quindi sarebbe l'esempio minimo. Immagino di essere solo bloccato con nomi di qualificatore lunghi (molto più lunghi di "MyEnum" nel mio codice attuale, purtroppo ...) – Kip

+0

@Kip: in questo caso, perché hai accettato questa risposta? – Thilo

0

No, questo è più o meno quello private è tutto.

+2

D'altra parte, la classe esterna può accedere direttamente a tutti i campi e metodi privati. Quindi il caso potrebbe essere fatto per volerlo importare. – Thilo

1

Considerando che è possibile accedere al campo pienamente qualificato, direi che si tratta di un bug nel compilatore (o nelle specifiche della lingua) che non è possibile importarlo staticamente.

Suggerisco di rendere protetto il pacchetto di enumerazione.

0

Si potrebbe semplicemente scrivere il codice all'interno dell'enum stesso.

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

L'altro luogo dove le enumerazioni privati ​​possono essere riferimenti senza la loro classe è in un'istruzione switch:

private static enum MyEnum { 
    DOG, CAT 
} 

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

È possibile utilizzare il livello di accesso no-modificatore, ovvero

enum MyEnum { DOG, CAT } 

MyEnum non sarà visibile alle classi da altri pacchetti né da alcuna sottoclasse. È la forma più vicina di privato, ma consente di evitare riferimenti espliciti a MyEnum.

2

Può (o non può) essere ragionevole spostare il codice in metodi (statici) dell'enumerazione.

Se premuto, è possibile duplicare i campi statici nella classe esterna.

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

Icky, ma una possibilità.

+0

Sì, ci ho pensato anche io. Immagino sia questo o semplicemente usando il nome qualificato. Né è l'ideale, ma penso che l'uso del nome qualificato sarà meno soggetto ad errori. – Kip

Problemi correlati