2014-04-17 21 views
60

Was ist der Unterschied zwischen statischen und nicht statischen enum in Java? Beide Nutzungen sind gleich.Statische enum vs. nicht statische enum

Ist es korrekt, dass alle statischen beim Start in den Arbeitsspeicher geladen werden, und nicht-statische werden bei Bedarf geladen? Wenn ja, welche Methode ist dann besser? Halten Sie einige Daten immer im Speicher oder verwenden Sie Serverressourcen, um sie jedes Mal zu laden?

public class Test { 

    public enum Enum1 { 
     A, B 
    } 

    public static enum Enum2 { 
     C, D 
    } 

    public static void main(String[] args) { 
     Enum1 a = Enum1.A; 
     Enum1 b = Enum1.B; 

     Enum2 c = Enum2.C; 
     Enum2 d = Enum2.D; 
    } 
} 
+0

Mit Eigenschaften meinen Sie Methoden? –

Antwort

102

Alle enum s sind effektiv static. Wenn Sie eine verschachtelte Enumeration haben, entspricht dies ungefähr static class.

Alle Klassen sind lazy geladen (enums oder anders) aber wenn sie geladen werden, werden sie alle auf einmal geladen. d. h. Sie können nicht einige Konstanten geladen haben, aber keine anderen (außer in der Mitte der Klasseninitialisierung)

Java erlaubt bestimmte Modifikatoren implizit zu sein, um zu vermeiden, dass sie ständig deklariert werden müssen. Dies bedeutet, dass das Hinzufügen eines Modifikators nicht notwendigerweise etwas anderes als eine längere Art des Schreibens derselben Sache bereitstellt.

Standard Modifikatoren für

Klassenfeld/Methode/geschachtelte Klasse - Paket lokale, nicht abschließend, nicht-statische

ENUM und verschachtelte ENUM - Paket lokal, endgültig und statische

Schnittstellenfeld - public static final

Interface-Methode - public abstract

geschachtelte Klasse in einer inte rface - public static, nicht-final

Hinweis: während static optional für eine enum ist, ist es immer statisch. Allerdings kann final nicht für eine Enumeration gesetzt werden, auch wenn es immer fiktiv final (Technisch Sie Subklassen mit überschriebene Implementierungen für Konstanten haben kann) ist

EDIT: Der einzige Ort, den Sie static mit enum verwenden müssen, ist mit import static einer Enum des Wert. Danke @ man910

+3

Sie können implizit sein, aber wenn Sie sie bei statischen Imports weiterleiten, müssen Sie sie trotzdem als statisch deklarieren. Zum Beispiel statisch importieren my.embedded.EnumType.SOME_VALUE; – man910

16

Wenn Sie verschachtelte Aufzählungen reden, sind sie implizit static standardmäßig.

Nach dem Java Language Specification:

Nested Aufzählungstypen sind implizit statisch. Es ist zulässig, explizit einen verschachtelten Enum-Typ als statisch zu deklarieren.

10

Alle Aufzählungen sind implizit statisch, es ist nur was Sie brauchen, um das static Schlüsselwort nicht zu schreiben. Ähnlich wie alle Schnittstellenmethoden implizit öffentlich sind.

3

Als enumsinherently static sind, ist es nicht erforderlich, und macht keinen Unterschied, wenn static-keyword in enums verwenden.

Wenn eine Enumeration Mitglied einer Klasse ist, ist sie implizit statisch.

Schnittstellen können Elementtypdeklarationen enthalten. Eine Membertyp-Deklaration in einer Schnittstelle ist implizit statisch und öffentlich.

Oracle Community Forum and Discussion On This