2012-06-14 8 views
5

Capisco posso creare un enum come questo:Un envo java può avere più di un costruttore?

public enum MyEnum { 
    ONE(1), 
    TWO(2); 
    private int value; 
    private MyEnum(int value) { 
     this.value = value); 
    } 
    public int getValue() { 
     return value; 
    } 
} 

Ma ho alcune domande:

1) Sembra che i valori enum sono dichiarati alla partenza. C'è un formato particolare per questo. Potrei dichiararli ovunque?

2) È possibile dichiarare un enum con più di un costruttore ed è qualcosa che le persone talvolta fanno?

+0

Cura di condividere come si desidera utilizzarlo? –

+1

Mi chiedo perché non hai provato 2) prima? –

+0

È possibile anche [overload constructors] (http://stackoverflow.com/q/6870710/1064325). – falsarella

risposta

5
public enum MyEnum { 
    ONE(1), 
    TWO(1, 2); 
    private int value1, value2; 

    private MyEnum(int value) { 
     this.value1 = value; 
     this.value2 = 0; // default 
     // this.value2 = getFromSomewhereElse(); // get it at runtime 
    } 

    private MyEnum(int value1, int value2) { 
     this.value1 = value1; 
     this.value2 = value2; 
    } 

    public int getValue1() { 
     return this.value1; 
    } 

    public int getValue2() { 
     return this.value2; 
    } 
} 
  1. Sì, è necessario dichiarare i valori enum al via. Sempre.
  2. Vedere il codice sopra. È possibile. Se le persone lo fanno dipende dall'applicazione. Se disponi di molti campi e la maggior parte di essi dovrebbe essere un valore predefinito, è preferibile utilizzare più costruttori. Inoltre, i valori dei campi potrebbero essere letti in fase di esecuzione (da un file o da un'altra classe statica).
8
  1. Sì, devono essere dichiarati prima di altri campi della classe enum.
  2. Sì, possono avere più di un costruttore.

Potresti averlo scoperto provandolo tu stesso.

+0

Lo so, quanto tempo potrebbe volerci? Tuttavia, ora è qui per quando gli altri lo cercano. Sono più interessato a quali casi sarebbe utile –

+0

Un enum è una classe. Se hai capito perché diversi costruttori potrebbero essere utili per una classe, hai anche capito perché potrebbero essere per un enum: per le stesse ragioni. –

+0

Enum è un tipo speciale di classe. Solo mostrare un esempio sarebbe un commento molto più utile di quello che implica che non capisco il sovraccarico dei costruttori. Dal tuo commento indicherei che l'esempio sarebbe l'impostazione predefinita di alcuni campi, questo è l'uso più comune per il sovraccarico di costruttori che conosco ... –

3
  1. Secondo JLS 7, le costanti vanno prima.

  2. "Qualsiasi dichiarazione del costruttore o membro all'interno di una dichiarazione di enumerazione si applica al tipo enum esattamente come se fossero state presenti nell'elemento di classe di una dichiarazione di classe normale, a meno che non sia stato esplicitamente indicato diversamente." e "È un errore in fase di compilazione se una dichiarazione del costruttore di un tipo enum è pubblica o protetta." (Ibid., 8.9.2)

Problemi correlati