2008-10-31 13 views
50

Ich habe eine Schnittstelle - hier ist eine gut erfundene Version als Beispiel:Verschachtelte Java-Enum-Definition - erklärt sich das als statisch?

public interface Particle { 

    enum Charge { 
     POSITIVE, NEGATIVE 
    } 

    Charge getCharge(); 

    double getMass(); 

    etc... 
} 

Gibt es einen Unterschied, wie Implementierungen dieses verhalten würde, wenn ich die Charge Enum als statisch definiert - also hat dies keine Auswirkungen:

public interface Particle { 

    static enum Charge { 
     POSITIVE, NEGATIVE 
    } 

    Charge getCharge(); 

    double getMass(); 

    etc... 
} 

Antwort

78

Nein, das macht keinen Unterschied. Der Grund ist jedoch nicht, weil es eine Member-Deklaration in einer Schnittstelle ist, wie Jon sagt. Der wahre Grund ist nach Sprache spec (8,9), dass

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

Am folgende Beispiel statisch macht keinen Unterschied entweder (obwohl wir keine Schnittstelle):

public class A { 
    enum E {A,B}; 
} 

public class A { 
    static enum E {A,B}; 
} 

Ein anderes Beispiel mit einem verschachtelten privaten Enum (nicht implizit öffentlich).

public class A { 
    private static enum E {A,B} 
} 
+2

Ich würde argumentieren, dass es beides ist - es ist implizit statisch aus zwei verschiedenen Gründen, aber jeder von beiden wäre alleine genug gewesen. –

30

Nein, es macht keinen Unterschied. Vom language spec, section 9.5:

Schnittstellen können Elementtyp Erklärungen (§8.5) enthalten. Ein Elementtyp Deklaration in einer Schnittstelle ist implizit static und public.

+0

ja (+1) und tatsächlich checkstyle würde die 'statisch' als redundant kennzeichnen und würde Sie bitten, sie zu entfernen. Variablen in Interfaces und Annotationen sind automatisch öffentlich, statisch und final, also sind diese Modifikatoren auch redundant. – VonC

Verwandte Themen