Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
ich hoffe, dass der Thementitel passend war .
Also ich habe einen Decoder, welcher einen Zahlenwert (int) erhält und damit eine gegebene Enumeration dekodieren soll.
Es geht speziell umASN1 den Typ Enumerated.
Ich habe also eine Klasse erstellt ASN1Enumerated, welche ASN1Type extended. Zum dekodieren soll dem Konstruktor der Klasse die Enum-Klasse übergeben werden und anschließend die Enum-Konstante per Getter abfragbar sein.
Ich möchte nun wissen, ob dies schlecht umgesetzt wurde oder ob sowas in Ordnung ist. Bei Ersterem: Wie könnte man es besser machen?
Java:
public class ASN1Enumerated extends ASN1Type {
protected Class<?> enumeration;
public <T extends Enum<T>> ASN1Enumerated(Class<T> enumeration) {
super(new ASN1Tag(ASN1Tag.ENUMERATED,
ASN1Tag.TagClass.UNIVERSAL), false);
this.enumeration = enumeration;
}
public Enum<?> getDecodedEnum() {
return (Enum<?>) enumeration.getEnumConstants()[0];
}
}
Das ist natürlich noch nicht der fertige Code, aber beispielhaft.
Daran sieht man jetzt nicht so viel. Vermutlich könnte (FALLS gewünscht) das T auch als
ASN1Enumerated<T extends Enum<T>> extends ...
dabeistehen, dann spart man sich innen die Raw Types
Ich würde das oben als finsteren Hack ansehen, aber ohne mehr Kontext ist es schwer, Verbesserungsvorschläge zu machen. Wieso ist der genaue enum-Typ unbekannt? Wieso muss es unbedingt ein enum sein? Hast du Kontrolle über alle Klassen, oder sind schon welche vorgegeben?
Der genaue Enum-Typ ist unbekannt, da es nur eine Bibliothek sein soll. Es gibt keine vorgegebenen Klassen.
Ich nehme an, dass ihr beiden wisst was ASN.1 ist oder? Der ASN.1 universal type Enumerated entspricht ja eigentlich in der Funktion dem von Java enum. Deswegen wollte ich dies so umsetzen.
Übertragen wird letztendlich dann auch nur ein Integer mit dem ordinal des Enum.
Alle Klassen welche ASN1Type extenden beinhalten ein Object "value", welches das entsprechende Java-Analog ist.
Man könnte auch sagen... ok ich halte einfach nur ein int-Wert als Value und der Nutzer der Lib muss sich selbst um die Validierung kümmern. Das finde ich aber irgendwie "schlampig" .
public Class<T> getEnumClass() {
return ((Enum<T>) value).getDeclaringClass();
}
Dann sagt mir eclipse, dass es ein unchecked Cast ist und bei Enum<?> jedoch nicht. Wenn ich mit instanceof prüfen möchte kommt folgendes:
Cannot perform instanceof check against parameterized type Enum<T>. Use the form Enum<?> instead since further generic type information will be erased at runtime
Die Methode stand bisher ja nicht dabei. Poste ggf. mal mehr (compilierbaren) Code (z.B. auch die Basisklasse und eine kleine main() mit der gewünschten Anwendung) aber sowas wie
Java:
class ASN1Enumerated<T extends Enum<T>> {
protected Class<T> enumeration;
public ASN1Enumerated(Class<T> enumeration) {
this.enumeration = enumeration;
}
public T getDecodedEnum() {
return enumeration.getEnumConstants()[0];
}
public Class<T> getEnumClass()
{
return enumeration;
}
}