Ich habe folgende Einstellungen:Aufzählungen gemeinsame statische Look-up-Methode
public enum MyEnum{
A(10, "First"), //
B(20, "Second"), //
C(35, "Other options");
private Integer code;
private String description;
private MyEnum(Integer code, String description) {
this.code = code;
this.description = description;
}
public Integer getCode() {
return code;
}
public String getDescription() {
return description;
}
public static MyEnum getValueOf(Integer code) {
for (MyEnum e : MyEnum.values()) {
if (e.getCode().equals(code)) {
return e;
}
}
throw new IllegalArgumentException("No enum const " + MyEnum.class.getName() + " for code \'" + code
+ "\'");
}
}
die gut arbeitet. Die getValueOf
-Methode existiert, weil wir bei der Kommunikation mit einem externen Partner nur den Code (den sie ausgewählt haben) zuordnen. Ich brauche die Beschreibung, weil ich eine sinnvolle Phrase in der GUI zeigen muss.
Aber ich habe jetzt eine Reihe von ähnlichen Enum-Klassen. Alle haben ihren eigenen Code & Beschreibung, und sie benötigen die gleiche Lookup-Funktionalität. Ich wollte die getValueOf
-Methode generisch sein, also brauche ich nicht 30+ verschiedene enums für im Grunde die gleiche Methode zu unterstützen.
Um dies zu lösen, wollte ich eine abstrakte Klasse erstellen, um diese Methode zu definieren und einige der allgemeinen Logik zu implementieren, aber das ist unmöglich, weil ich Enum
nicht erweitern kann.
Dann habe ich versucht, eine Utility-Klasse mit der folgenden Methode zu machen:
public static <T extends Enum<T>> T getValueOf(Enum<T> type, Integer code) {...}
Aber Generika mit Aufzählungen verwirrend ist, und ich verstehe nicht, wie diese Funktion zu erhalten.
Grundsätzlich möchte ich wissen: Was ist ein guter Ansatz, um ein gemeinsames Dienstprogramm zu einem Enum zu definieren?
FYI, das obige könnte eine NPE werfen, wenn getCode null zurückgibt. Ich würde die 'if'-Bedingung für null einchecken. –
@JohnB, in der Tat. Ich habe den Code aus dem OP kopiert und mich nicht darum gekümmert, ihn zu verbessern. Wenn überhaupt, würde ich statt einer Nullprüfung den Typ von 'code' in' int' ändern, um das Problem im Keim zu ersticken. –
Ich nahm das tatsächlich und in mein eigenes Dienstprogramm Projekt integriert. Made 'Encodable' generic so die Methode wurde' public static & Encodable > T getValueOf (Klasse enumClass, U-Code) 'Ich hoffe, es macht Ihnen nichts aus. –