2016-12-31 1 views
2

Ich habe eine Karte, in der ich Keyset der Karte mit meinem enum validieren muss. Ich habe eine Enum-Klasse wie folgt:Elegante Möglichkeit, Schlüsselsatz einer Karte mit einem Enum zu validieren?

public enum Tag { 
    rename, duplicate, process, limit, encode, decode; 
    }; 

Jetzt keyset der Karte sollten Werte von oben Enum haben. Wenn mein Keyset einen Wert enthält, der in der Enumeration nicht vorhanden ist, dann möchte ich IllegalArgumentException mit dem fehlenden Wert aus meiner Enum werfen.

Unten ist mein Code:

public Processor(Map<String, String> tasks) { 
    Set<String> keyset = tasks.keySet(); 
    for (String tag : keyset) 
     checkArgument(!EnumUtils.isValidEnum(Tag.class, tag), "unknown tag found '%s'.", tag); 
    } 

Wie Sie sehen, ich bin keyset Iterieren und Preconditions.checkArgument Prüfung zu tun. Wenn es nicht da ist, wird es IllegalArgumentException werfen. Ich bin sicher, dass das Werfen von Nachrichten verbessert werden kann.

Meine Frage ist: Gibt es eine bessere Möglichkeit, das Gleiche zu tun, als was ich tue? Muss ich die keyset in der for-Schleife durchlaufen, um die Überprüfung durchzuführen? Oder gibt es einen Liner oder einen anderen besseren Weg, um diese Validierung durchzuführen?

Ich verwende Java7.

+1

Wenn Sie möchten, dass Ihre Map Schlüssel aus der 'Tag'-Enumeration enthält, sollte es keine' Map 'sein. – user2357112

+1

Verwenden Sie einfach eine 'Karte '? Vielleicht sogar eine 'EnumKarte'? – chrylis

Antwort

6

Sie tun ein bisschen zu viel Arbeit. In realistischer Weise müssen Sie lediglich Ihren Schlüssel in der Karte an Tag binden.

public Processor(Map<Tag, String> tasks) { 
    // processor logic  
} 

Diese garantiert, dass die Schlüssel in der Karte in Dose geleitet nur jemals Tag sein. Sie benötigen die Ausnahme in diesem Schema auch nicht, da Ihr Code nicht kompiliert werden kann, wenn ein ungültiger Schlüssel übergeben wird. Da es sich um ein Enum handelt, werden Sie auch keine Schlüssel erhalten, die nicht in diesem Enum enthalten sind.

Wenn Sie eine Liste von Zeichenfolgen verarbeiten und das Enum nicht direkt abrufen können, können Sie Tag.valueOf("<string value here>") verwenden, um es zu konvertieren.

+0

Der Benutzer will IllegalArgumentException werfen ... wo ist das in Ihrem Code ????? – prashant

+1

@prashant Sie müssen es nicht werfen. Dies ergibt eine Kompilierzeitprüfung für die Map und keine Laufzeitprüfung. Wir haben das bereits in Ihrer Antwort besprochen und ich sehe keinen Grund, es hier erneut zu versuchen. – Makoto

+0

Aber der Benutzer will @Makoto werfen .... es könnte für einen Business Case sein, wo er solche Ereignisse verfolgen möchte ... – prashant

Verwandte Themen