2010-01-12 7 views
6

Ich habe eine Enum, die privat ist, nicht außerhalb der Klasse ausgesetzt werden. Gibt es trotzdem einen statischen Import dieses Typs, so dass ich den Enum-Typ nicht jedes Mal eingeben muss? Oder gibt es eine bessere Möglichkeit, dies zu schreiben? Beispiel:Kann ich einen statischen Import einer privaten Unterklasse durchführen?

package kip.test; 

import static kip.test.Test.MyEnum.*; //compile error 

public class Test 
{ 
    private static enum MyEnum { DOG, CAT } 

    public static void main (String [] args) 
    { 
    MyEnum dog = MyEnum.DOG; //this works but I don't want to type "MyEnum" 
    MyEnum cat = CAT; //compile error, but this is what I want to do 
    } 
} 

Antwort

3

Oder gibt es eine bessere Möglichkeit, dies zu schreiben?

Wenn Ihre Hauptziele sind die Elemente, ohne die Qualifikation Enum-Kennung zu verweisen, und halten Sie diese Liste privat, könnten Sie die enum Art ganz Schrott und gewöhnliche private static Konstanten verwenden.

+4

nein, enum bietet neben der Kapselung auch andere Formen der Sicherheit - zum Beispiel können Sie sie in switch-Anweisungen verwenden, und Sie können Warnungen erhalten, wenn Sie eine weglassen. Bleiben Sie einfach beim Qualifier - es gibt schlechtere Ausführlichkeitsprobleme in Java;) – Chii

+0

@akf: Chii hat recht, in meinem tatsächlichen Code haben die Enums ein Verhalten, das über das hinausgeht, was mit statischen Konstanten trivial gemacht werden kann. Ich habe das alles für die Frage vereinfacht, also wäre es das einfachste Beispiel. Ich denke, ich bin nur mit langen Qualifier-Namen (viel länger als "MyEnum" in meinem tatsächlichen Code leider ...) stecken – Kip

+0

@Kip: In diesem Fall, warum haben Sie diese Antwort? – Thilo

0

Nö, das ist ziemlich viel, was private geht.

+2

Auf der anderen Seite kann die äußere Klasse direkt auf alle privaten Felder und Methoden zugreifen. Es könnte also der Fall eintreten, dass man es importieren möchte. – Thilo

1

Angesichts der Tatsache, dass Sie auf das Feld voll qualifiziert zugreifen können, würde ich sagen, dass es ein Fehler im Compiler (oder Sprachspezifikation) ist, dass Sie es nicht statisch importieren können.

Ich schlage vor, dass Sie das Aufzählungspaket-geschützt machen.

0

Sie könnten Ihren Code einfach in das Enum selbst schreiben.

public enum MyEnum { 
DOG, CAT; 
public static void main(String[] args) { 
    MyEnum dog = MyEnum.DOG; // this works but I don't want to have to type 
           // MyEnum 
    MyEnum cat = CAT; // compile error, but this is what I want to do 
} 
} 

Der andere Ort, an den privaten Aufzählungen können Referenzen ohne ihre Klasse ist in einer switch-Anweisung:

private static enum MyEnum { 
    DOG, CAT 
} 

public static void main(String[] args) { 
    MyEnum e = null; 
    switch (e) { 
    case DOG: 
    case CAT: 
    } 
} 
4

Sie können die nicht-Modifikator Zugriffsebene, dh

enum MyEnum { DOG, CAT } 

MyEnum ist für Klassen aus anderen Paketen und keiner Unterklasse sichtbar. Es ist die nächstgelegene private Form und lässt Sie dennoch vermeiden, explizit auf MyEnum zu verweisen.

2

Es kann (oder auch nicht) sinnvoll sein, einen Teil des Codes in (statische) Methoden der Enumeration zu verschieben.

Wenn Sie diese Taste drücken, können Sie die statischen Felder in der äußeren Klasse duplizieren.

private static final MyEnum CAT = MyEnum.CAT; 
private static final MyEnum DOG = MyEnum.DOG; 

Icky, aber eine Möglichkeit.

+0

Ja, ich dachte auch daran. Ich denke, es ist entweder das oder nur den qualifizierten Namen zu verwenden. Beides ist nicht ideal, aber ich denke, dass die Verwendung des qualifizierten Namens zumindest weniger fehleranfällig ist. – Kip

Verwandte Themen