В настоящее время у меня есть несколько перечислений, определенных для нескольких классов. Все они похожи на показанный ниже:Создание абстрактного базового класса для обработки различных типов перечислений
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;
}
}
Существует также метод, определенный в ApaMessage:
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;
}
Проблема заключается в том, хотя там не много кода, я скоро 10-20 из этих перечислений. Я хотел бы создать абстрактный базовый класс, в котором метод HashMap и другие подобные методы могут быть частью. Базовый класс должен принимать перечисление ApaFields и другие перечисления и делать то, что делает getApaJsonFieldsAndValues. Проблема в том, как базовый класс может получить доступ к переданным значениям enum и внутренним полям, таким как jsonName, для выполнения цикла?
Я пробовал разные подходы, но главная проблема заключается в том, что базовый класс не может получить доступ к значениям. Есть ли способ обойти это? Альтернативно, есть ли лучший подход? Благодаря
EDIT:
В основном я хотел бы что-то подобное в базовом классе. Обратите внимание, что нижеследующее не компилируется.
общественного абстрактного класса 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
}
}
}
А затем вызвать базовый метод следующим образом, хотя и не уверен, если это правильно, где ApaFields это внутреннее перечисление определено выше.
ApaRequest(ApaFields.class, somestringmessage);
Покажите нам, что вы попробовали. –
Если ваш пример не вводит в заблуждение, я думаю, вы не должны использовать внутренние перечисления. Я либо использовал бы определенную извне перечисление, содержащее все FIELDS, либо объявлял бы один FIELD как приватное поле для каждого класса. – Aaron
Возможно, ваши перечисления должны реализовать общий интерфейс и работать только с этим интерфейсом в методе, возвращающем хэш-карту. – dumitru