Это немного сложная проблема, но я сделаю все возможное, чтобы объяснить ее понятным образом.
Для начала рассмотрим следующие классы.
public abstract class Invokable {
private String name;
protected Invokable(String name) { ... }
public String getName() { ... }
public abstract void invoke();
}
public class PrintInvokable extends Invokable {
public PrintInvokable() {
super("print");
}
@Override
public void invoke() { ... }
}
Другой класс, InvokerDispatcher
, обрабатывает события из приложения обмена сообщениями и вызывает Invokable#invoke
в экземпляре соответствующей реализации на основе поля name
.Все это делается рефлексивно, чтобы иметь возможность сканировать путь к классам для всех допустимых Invokable
реализаций и динамически загружать их во время выполнения.
Проблема здесь в том, что я могу получить доступ к name
только через экземпляр,поэтому я должен создать копию каждого Invokable
, чтобы проверить его имя по содержанию сообщения.Мое решение сейчас состоит в том, чтобы хранить список предварительно созданных экземпляров каждой реализации в отдельном классе, а затем вызывать метод, который выбирает и заменяет экземпляр из списка по имени.
Я бы хотел бытьвместо этого я могу получить статический доступ к name
, но я не могу придумать способ сделать это принудительно.static abstract getName()
в Invokable
было бы самым простым способом сделать это, но, к сожалению, Java не поддерживает его.Любые идеи?
Моя абстракция этой проблемы, вероятно, не самая лучшая, поэтому вот мой фактический исходный код .Соответствующие классы находятся в пакете command
.