Статическое предоставление метаданных для класса принудительным образом - PullRequest
1 голос
/ 04 июля 2019

Это немного сложная проблема, но я сделаю все возможное, чтобы объяснить ее понятным образом.

Для начала рассмотрим следующие классы.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...