Получить "тип" enum из String
Есть интерфейс Callback и два enum, которые его имплементят(Subject, Request). И нужно из String получить конкретный тип enum. Как можно это сделать так, чтобы если добавлялись бы еще enumы, не пришлось бы сильно трогать весь код?
package callbacks;
public interface Callback {
public Callback getType();
public String getText();
}
////////////////////////////////
public enum RequestType implements Callback {
SHOW_TASKS("show_tasks"),
COMMIT_TASKS("commit"),
CANCEL_COMMIT("cancel_commit"),
NONE("none");
private String text;
RequestType(String text) {
this.text = text;
}
@Override
public Callback getType() {
return RequestType.this;
}
@Override
public String getText() {
return text;
}
}
////////////////////
public enum SubjectType implements Callback {
MATH("math"),
PROGRAMMING("programming"),
ALGEBRA("algebra"),
DISCRETE("discrete");
private String text;
SubjectType(String text) {
this.text = text;
}
@Override
public Callback getType() {
return SubjectType.this;
}
@Override
public String getText() {
return text;
}
}
Нужно что-то вроде утилитарного метода getCallbackFromString(String s)
UPD: Мне приходит "сообщение", у которого есть параметр Callback, возвращающий String. Этот String нужно преобразовать в один из типов Subject или Request(назовем этот объект masha). Причем, чтобы после этого можно было его использовать так:
if (masha == Request){
if (masha.getRequest() == COMMIT){
//do work();
}
}
Ответы (1 шт):
Автор решения: Fagam32
→ Ссылка
Проще всего оказалось просто немного отредактировать интерфейс и добавить утильный метод.
public interface Callback {
public Class<? extends Enum> getType();
public String getText();
}
public enum RequestType implements Callback {
SHOW_TASKS("show_tasks"),
COMMIT_TASKS("commit"),
CANCEL_COMMIT("cancel_commit"),
REGISTER("register"),
NONE("none");
private String text;
RequestType(String text) {
this.text = text;
}
@Override
public Class<? extends RequestType> getType() {
return this.getClass();
}
@Override
public String getText() {
return text;
}
}
//Утильный метод
public static Callback getCallbackFromString(String s) {
if (RequestType.valueOf(s.toUpperCase()).getType() == RequestType.class)
return RequestType.valueOf(s);
if (SubjectType.valueOf(s.toUpperCase()).getType() == SubjectType.class)
return SubjectType.valueOf(s);
else return RequestType.NONE;
}