2016-07-05 10 views
0

Ich habe eine Frage zu den Best Practices im Umgang mit Enums in Java. Lassen Sie uns sagen, dass ich eine Java-Klasse und eine ENUM-Klasse wie folgt:Best Practices für Java-Enum-Initialisierung

public class Foo { 
    private final FooEnum fooEnum; 

    public Foo(FooEnum fooEnum) { 
     this.fooEnum = fooEnum; 
    } 

    public Foo(String fooEnum) { 
     this.fooEnum = FooEnum.valueOf(fooEnum); 
    } 
} 

public enum FooEnum { 
    FOO1, 
    FOO2, 
    FOO3 
} 

Meine Frage lautet: Ist es als gute Praxis, einen zweiten Konstruktor zu bieten, die in einem String führt den Enum zu initialisieren, so kann der Benutzer wählen Entweder ein Enum übergeben oder es entspricht String? Wenn nicht, was ist die Alternative? Sollte der Benutzer für die Umwandlung der Zeichenfolge in eine Enum verantwortlich sein?

+5

Wenn Sie den Zeichenfolgenkonstruktor bereitstellen, verlieren Sie die _type-safety_, die mit Enums geliefert wird. Sie sollten keine Zeichenfolgen in Ihrer Anwendung/Geschäftslogik verwenden müssen. Die Umwandlung von Zeichenfolgen/enums muss nur erfolgen, wenn Sie Daten konvertieren, die von der Benutzeroberfläche oder der Datenbank stammen. –

Antwort

8

Nein, ist es eine schlechte Praxis, das zu tun:

  1. Sie sind nur Code hinzufügen, die verwendet werden können, nicht: YAGNI, wie sie sagen. Und wenn Sie eine FooEnum für eine Zeichenfolge benötigen, ist es so schlecht zu sagen new Foo(FooEnum.valueOf(str))?
  2. Was passiert, wenn ich die Zeichenfolge "Bibble" übergeben: Es ist kein Problem in Foo, dass die Ausnahme ausgelöst wird, so dass Foo in diesem Problem nicht beteiligt sind.

    Indem Sie einen String Konstruktor bereitstellen, sagen Sie, dass "Sie mir eine beliebige Zeichenfolge übergeben können" (von denen es praktisch unendlich viele gibt); Indem Sie einen FooEnum Konstruktor zur Verfügung stellen, sagen Sie, dass "Sie mir irgendwelche FooEnum übergeben können", von denen es eine sehr kleine Zahl gibt. Sie begrenzen also den Raum gültiger Eingaben erheblich; und der Benutzer wird nicht raten, was eine gültige Eingabe sein könnte.

Die Alternative: Da Sie eine Instanz von FooEnum in Ihrem Foo, den Benutzer der Klasse Pass in einer Instanz von FooEnum machen müssen.