Derzeit habe ich mehrere Enums über mehrere Klassen definiert. Sie sehen alle ähnlich dem unten dargestellt:Erstellen einer abstrakten Basisklasse für verschiedene Arten von Enums
public class ApaMessage {
private String apaMessage;
private final int FIXED_LENGTH_SIZE=39;
public enum ApaFields {
FIELD1(ApaUtils.ApaFieldTypes.POSITION_BASED, null, "field1", 2, 3, false, false),
private final ApaUtils.ApaFieldTypes type;
private final String ApaName;
private final String jsonName;
private final int start;
private final int finish;
private boolean required = false;
private boolean withDelimiter = false;
ApaFields(ApaUtils.ApaFieldTypes type, String ApaName, String jsonName, int start, int finish, boolean required, boolean withDelimiter) {
this.type = type;
this.ApaName = ApaName;
this.jsonName = jsonName;
this.start = start;
this.finish = finish;
this.required = required;
this.withDelimiter = withDelimiter;
}
}
Es gibt auch ein Verfahren, in ApaMessage definiert:
private HashMap<String,Object> getApaJsonFieldsAndValues() {
HashMap<String, Object> jsonApaData = new HashMap<String, Object>();
for (ApaFields field : ApaFields.values()) {
jsonApaData.put(field.jsonName, getApaFieldValue(field));
}
return jsonApaData;
}
Das Problem ist, obwohl es nicht viel Code, ich werde bald 10-20 dieser enums. Ich möchte eine abstrakte Basisklasse erstellen, in die die HashMap-Methode und andere ähnliche Methoden eingebunden werden können. Die Basisklasse sollte eine ApaFields-Enumeration und andere Enums akzeptieren und tun, was getApaJsonFieldsAndValues tut. Das Problem ist, wie kann die Basisklasse auf die übergebenen enum-Werte und die internen Felder wie jsonName zugreifen, um die Schleife auszuführen?
Ich habe verschiedene Ansätze ausprobiert, aber das Hauptproblem ist, dass die Basisklasse scheinbar nicht auf die Werte zugreifen kann. Gibt es einen Weg dazu? Oder gibt es einen besseren Ansatz? Dank
EDIT:
Grundsätzlich würde ich so etwas wie dies in der Basisklasse mag. Beachten Sie, dass das Folgende nicht kompiliert wird.
public abstract class ApaRequestMessage {
private Class<? extends Enum<?>> apaRequestMessageFields;
private String apaMessage;
public <T extends Enum<T>> void ApaRequest(Object apaRequestFields, String apaMessage) {
apaRequestMessageFields = (Class<? extends Enum<?>>) apaRequestFields;
this.apaMessage = apaMessage;
for (Field field: apaRequestMessageFields.values()) {
//this doesn't work because it cannot access the values of apaRequestMessageFields
}
}
}
Und dann die Basis-Methode aufrufen, wie folgt, wenn auch nicht sicher, ob dies richtig ist, wo ApaFields die innere Enum oben definiert ist.
Zeigen Sie uns, was Sie versucht haben. –
Wenn Ihr Beispiel nicht irreführend ist, sollten Sie keine inneren Aufzählungen verwenden. Ich würde entweder eine extern definierte Enumeration verwenden, die alle FIELDS enthält, oder ein einzelnes FIELD als privates Feld für jede Klasse deklarieren. – Aaron
Vielleicht sollten Ihre Enums eine gemeinsame Schnittstelle implementieren und Sie arbeiten nur mit dieser Schnittstelle in der Methode, die die Hash-Map zurückgibt. – dumitru