2012-03-27 7 views
18
public interface Proposal { 
    public static final enum STATUS { 
     NEW , 
     START , 
     CONTINUE , 
     SENTTOCLIENT 
    }; 
} 

Java non consente l'enum final all'interno di un'interfaccia, ma per impostazione predefinita ogni membro di dati all'interno di un'interfaccia è public static final. Qualcuno può chiarirlo?Perché un enum di Java non può essere definitivo?

+0

È che pensi che un enum non finale sia in qualche modo sottoclassabile? –

+0

no sapevo che enum non può essere sottoclasse ma java ci dà la libertà di scrivere finale da qualsiasi costante nell'interfaccia, ma non di fronte a enum, perché questo è in parte quello che stavo chiedendo (cercando solo di leggere cosa c'è nella loro mente mentre fanno questo?) –

+0

c'è un'enorme differenza tra il modo in cui 'finale' viene utilizzato tra le definizioni di classe/interfaccia (e, in linea di principio, enum) e le definizioni del campo * del membro * (che cosa sono in genere le" costanti "in un'interfaccia). Uno riguarda la sottoclassabilità e l'altro incide sulla mutabilità. –

risposta

21

Un enum non può essere definitivo, perché il compilatore genererà sottoclassi per ogni voce enum per cui il programmatore ha definito esplicitamente un'implementazione.

Inoltre, un enum in cui nessuna istanza ha il proprio corpo di classe è implicitamente definitivo, da JLS section 8.9.

25

Java non consente di creare una classe che estende un tipo enum. Pertanto, le enumerazioni stesse sono sempre definitive, quindi l'uso della parola chiave final è superfluo.

Ovviamente, in un certo senso, enum s non sono definitivi in ​​quanto è possibile definire una sottoclasse anonima per ogni campo all'interno del descrittore enum. Ma non avrebbe molto senso usare la parola chiave final per prevenire questi tipi di descrizioni, perché le persone dovrebbero creare queste sottoclassi all'interno dello stesso file .java, e chiunque abbia i diritti per farlo potrebbe facilmente rimuovere la parola chiave final . Non c'è il rischio che qualcuno estenda il tuo enum in qualche altro pacchetto.

+0

Risposta completamente confusa. Se osservi la fonte della classe java.lang.Enum, puoi vedere che non è definitiva ma una classe astratta. –

+2

Tuttavia, nessun tipo 'enum' può essere sottoclasse. –

+5

@EugeneKuleshov: la classe 'Enum' è astratta perché devi essere in grado di estenderla. Ma l'effettivo 'enum' che lo estende viene definito dal compilatore come classi' final'. Vedi http://mindprod.com/jgloss/enum.html#UNDERTHEHOOD1 – StriplingWarrior

6

Due cose:

  1. enumerazioni sono sottoclassi finali di java.lang.Enum
  2. se un enum è un membro di una classe, è implicitamente statica
2

Nessun punto nel dichiarare enum final. Finale per le classi significa che non possono essere ereditate. Tuttavia, le enumerazioni non possono essere ereditate di default (cioè sono definitive).

L'ultima cosa è valida solo per le variabili. Tuttavia, dovresti pensare alle enumerazioni più come i tipi di dati che le variabili.