Получить "тип" 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;
}
→ Ссылка