2013-02-13 7 views
46

Was ich versuche, ist, dies zu tun:Warum kann ich eine Enum in einer inneren Klasse in Java nicht erstellen?

public class History { 
    public class State { 
     public enum StateType { 

Eklipse gibt mir diesen Compiler-Fehler auf StateType: The member enum StateType must be defined inside a static member type.

Der Fehler verschwindet, wenn ich die State Klasse statisch mache. Ich könnte State statische machen, aber ich verstehe nicht, warum ich eine enum in einer inneren Klasse nicht erklären kann.

+1

Bitte sehen Sie sich dies an: http://StackOverflow.com/Questions/700831/java-local-enums –

+1

Wenn Sie nicht möchten, dass State auf Methoden in History zugreifen kann, geben Sie State eine [statische Klasse] (http: // stackoverflow.com/a/1353326/2054731). – ArneHugo

Antwort

79

enum Typen, die als verschachtelte Typen definiert werden, sind immer implizit static (siehe JLS §8.9. Enums)

Sie keine statische verschachtelte Art in einem nicht-statischen (auch bekannt als eine „inneren Klasse“, siehe JLS §8.1.3. Inner Classes and Enclosing Instances) haben .

Daher können Sie keinen enum Innentyp innerhalb eines nicht statischen geschachtelten Typs haben.

2

Bereits genug Informationen von + Joachim Sauer, ich füge nur einige zusätzliche Details hinzu.

Sie können innere enum nur definieren, wenn Ihre innere Klasse statisch geschachtelte innere Klasse ist. Siehe unten

private static class DbResource { 

    public enum DB { 
     MERGE_FROM, MERGE_TO, MAIN; 
    } 
} 
3

Wenn Sie eine Enumeration wie folgt erklärt:

enum Suit {SPADES, HEARTS, CLUBS, DIAMONDS} 

Der Java-Compiler die folgende Klasse für Sie synthetisch erzeugen:

final class Suit extends java.lang.Enum<Suit> { 
    public static final Suit SPADES; 
    public static final Suit HEARTS; 
    public static final Suit CLUBS; 
    public static final Suit DIAMONDS; 
    private static final Suit[] $VALUES; 
    public static Suit[] values(); 
    public static Suit valueOf(java.lang.String); 
    private Suit(); 
} 

Es besteht keine Absicht zu schaffen andere Instanzen dieser Klasse sind anders als die bereits darin definierten statischen Felder (wie Sie aus ihrem privaten Konstruktor schließen können), aber am wichtigsten und, wie in der akzeptierten Antwort erwähnt, ein Inneres Klasse kann keine statischen Member haben (JLS §8.1.3. Inner Classes and Enclosing Instances), und da die enum synthetische Klasse dies tut, macht sie sie als innere Klasse unakzeptabel.

+0

Wie bist du hier gelandet? :) –

+0

Was meinst du? –

Verwandte Themen