Наложение статической переменной во все подклассы интерфейса - PullRequest
0 голосов
/ 23 октября 2018

У меня есть интерфейс Calculator, который формирует класс, который вычисляет некоторые результаты и возвращает их с заданной схемой.

interface Calculator {
    List<Object> getResults();
    List<String> schema();
}

Каждый из его подклассов имеет свою схему, так как они не вычисляют точноте же вещи.Но все экземпляры одного и того же подкласса имеют одну и ту же схему, поскольку каждый раз она вычисляется одинаково.

Проблема в том, что я хочу получить доступ к этой схеме где-то еще в моем коде без необходимости что-либо вычислять, поскольку вычисления могут бытьдорогой.

В идеале мне бы хотелось, чтобы у каждого подкласса был свой атрибут public static final List<String> SCHEMA.Но поскольку статические атрибуты / методы не могут быть переопределены, я не могу требовать, чтобы все подклассы интерфейса Calculator реализовывали его.

Есть ли способ обойти или я должен сохранить схему при вычислении результатов, ипередать эту схему для дальнейшего использования?(думаю, это может стать утомительным)

1 Ответ

0 голосов
/ 23 октября 2018

Для строковых констант вы можете использовать для схемы аннотацию класса и проверку во время выполнения:

default List<String> schema() {
    Schema schema = getClass().getAnnotation(Schema.class);
    if (schema == null) {
        throw new IllegalStateException("Class is missing @Schema annotation: "
            + getClass().getName());
    }
    return schema.getValues();
}

@Schema({"e", "pi", "i"})
public class ScientificCalculator implements Calculator { ... }

Более динамичные вещи можно сделать с помощью переопределения schema().

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