Это немного сложный вопрос, но я сделаю все возможное, чтобы объяснить его понятно.
Для начала рассмотрим следующие классы.
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
.
Invokable
заполняли полеname
. Я не думаю, что карта будет намного лучше, чем мое текущее решение, особенно с учетом того, что мне все равно придется создавать экземпляры каждого класса хотя бы один раз, чтобы получить соответствующий ключ (т.е.name
) - person cbryant02   schedule 04.07.2019List<Invokable>
экземпляром каждой реализацииInvokable
, найденной в пути к классам. Метод предоставляется классом, который находитInvokable
по имени, удаляет его экземпляр из списка, заменяет его новым экземпляром, а затем возвращает удаленныйInvokable
. Он отлично работает, но я бы предпочел выставлятьname
и любые другие поля статически, чтобы мне не приходилось постоянно хранить экземпляр каждой реализации в памяти. - person cbryant02   schedule 04.07.2019