11 Stimmen

Kann ich eine statische Importierung einer privaten Unterklasse machen?

Ich habe ein Enum, das privat ist und nicht außerhalb der Klasse freigelegt werden soll. Gibt es irgendeine Möglichkeit, eine statische Importierung dieses Typs durchzuführen, sodass ich den Enum-Typ nicht jedes Mal eingeben muss? Oder gibt es einen besseren Weg, dies zu schreiben? Beispiel:

package kip.test;

import static kip.test.Test.MyEnum.*; //Kompilierfehler

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

  public static void main (String [] args)
  {
    MyEnum dog = MyEnum.DOG; //das funktioniert, aber ich möchte nicht "MyEnum" eingeben
    MyEnum cat = CAT; //Kompilierfehler, aber das ist das, was ich tun möchte
  }
}

10voto

Sug Punkte 822

Sie können den no-modifier Zugriffslevel verwenden, d.h.

enum MyEnum { DOG, CAT }

MyEnum wird weder für Klassen aus anderen Paketen sichtbar noch für Unterklassen. Es ist die nächstgelegene Form von privat, die es Ihnen jedoch ermöglicht, MyEnum nicht explizit zu referenzieren.

5voto

Thilo Punkte 248982

In Anbetracht dessen, dass Sie auf das Feld vollständig qualifiziert zugreifen können, würde ich sagen, dass es ein Fehler im Compiler (oder in der Sprachspezifikation) ist, dass Sie es nicht statisch importieren können.

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

3voto

Tom Hawtin - tackline Punkte 142461

Es könnte vernünftig sein, einen Teil des Codes in (statische) Methoden des Enums zu verschieben.

Wenn nötig, könnten Sie die statischen Felder in der äußeren Klasse duplizieren.

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

Ekelig, aber eine Möglichkeit.

2voto

akf Punkte 37387

Oder gibt es einen besseren Weg, dies zu schreiben?

Wenn Ihre Hauptziele darin bestehen, auf die Elemente ohne ihren qualifizierenden Enum-Bezeichner zu verweisen und diese Liste privat zu halten, könnten Sie den Enum-Typ vollständig entfernen und stattdessen gewöhnliche private statische Konstanten verwenden.

1voto

brianegge Punkte 28043

Sie könnten Ihren Code einfach innerhalb des Enums selbst schreiben.

public enum MyEnum {
DOG, CAT;
public static void main(String[] args) {
    MyEnum dog = MyEnum.DOG; // das funktioniert, aber ich möchte nicht MyEnum eingeben müssen
    MyEnum cat = CAT; // Kompilierungsfehler, aber das ist was ich machen möchte
}
}

Der andere Ort, an dem private Enums ohne ihre Klasse referenziert werden können, 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:
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X