Я пытаюсь подготовить interface
, который я хочу реализовать для классов Datamodel.
Для этого я хочу использовать enum
внутри interface
, поэтому я знаю, что мне нужно его реализовать позже.
Пример:Java-интерфейс, содержащий пустой Enum
public interface MyModelInterface {
public enum Field;
public Object get(Field field);
public void set(Field field, Object value);
}
Ожидаемое внедрение:
public class MyModel implements MyModelInterface {
public enum Field {
ID("id"),
Name1("Name1"),
Name2("Name2");
private String field;
private Field(String field) {
this.field = field;
}
}
public Object get(Field field) {
//...
}
public void set(Field field, Object value){
//...
}
public static void main(String[] args) {
MyModel myModel = new MyModel();
System.out.println(myModel.get(MyModel.Field.ID));
System.out.println(myModel.get(MyModel.Field.Name1));
}
}
Поскольку я не знаю, какие поля модель будет содержать, пока я не реализовать. Я сделал некоторые исследования и понял, что enum
не может быть расширен, поэтому я знаю об этом. Есть ли способ архивировать этот или любой способ обхода?
Я не хочу использовать String
Параметры на приемнике/сеттере Способы избежать неправильных значений.
Заранее благодарим за любые предложения.
Update:
Так это то, что работает для меня: Разделение интерфейса/класса в трех частях, в том числе abstract class
:
Интерфейс:
public interface MyModelInterface<E extends Enum<E>> {
public Object get(E field);
public void set(E field, Object value);
}
Аннотация Класс:
public abstract class MyAbstractModel<E extends Enum<E>> implements MyModelInterface<E>{
protected final EnumMap<E, Object> fields;
public MyAbstractModel(Class<E> enumKlazz) {
fields = new EnumMap<>(enumKlazz);
}
@Override
public Object get(E field) {
return fields.get(field);
}
@Override
public void set(E field, Object value) {
this.fields.put(field, value);
}
}
Класс (где я фактически архивирую свою цель):
public class MyModel extends MyAbstractModel<MyModel.Field> {
public MyModel() {
super(MyModel.Field.class);
}
public enum Field {
ID("ID"),
Name1("NAME1"),
Name2("NAME2"),
Age("AGE"),
;
private final String field;
private Field(String field) {
this.field = field;
}
public String getName() {
return field;
}
}
public static void main(String[] args) {
MyModel myModel = new MyModel();
System.out.println(myModel.get(Field.Name1));
}
}
Возможно, создавая Класс 'abstract' с несколькими константами может сработать для вас? – Dragondraikk
Я тоже думал об этом, но он работал бы только в том случае, если модель, содержащая поля, подобна, например. клиента и поставщика. хотя, если я использую String константы, все еще можно использовать методы с другими значениями, например: setValue («anyString», «Testvalue»); который я хочу избежать использования 'enum'. – KnusperPudding