Лучшие практики для предоставленных реализаций интерфейсов - PullRequest
0 голосов
/ 19 декабря 2018

Я разрабатываю библиотеку на Java, которая содержит некоторые функциональные возможности, в которых некоторые значения должны будут проходить через какую-то функцию, чтобы преобразовать или отобразить их таким образом.Если вам нужна более подробная информация, это робототехническая библиотека, в которой необходимо математически изменить наборы уровней выходной мощности двигателя.

В настоящее время я реализовал это через интерфейс Mapper с runметод, который принимает метод карты.Пользователи используют это так:

wheelValues.map(new Mapper() {
    @Override
    public double run(double input) { ••• }
});

Дело в том, что я хочу включить некоторые реализации по умолчанию интерфейса Mapper для удобства пользователя, например абсолютное значение Mapper.Я хочу сделать это свойством интерфейса Mapper как-нибудь.Как лучше всего подойти к этому, статический внутренний класс или статические открытые поля?

public interface Mapper {
    // This?
    static final Mapper ABS = new Mapper() {...}
    // Or this?
    static class Abs implements Mapper {...}
}

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Начните с использования стандартных библиотечных интерфейсов, где это возможно;например, ваш Mapper выглядит как дубликат DoubleFunction (или Function<Double, Double>).Абсолютное значение предоставляется Math.abs, и вы уже можете сослаться на него, сказав Math::abs, «реализация по умолчанию» не требуется.

Что касается вопроса о готовых реализациях, существует дваобщие категории:

  • Полностью чистые функции (без ручек и настроек) обычно реализуются как константы где-то.Хорошим примером этого является String.CASE_INSENSITIVE_ORDER, который является константой Comparator<String>, которая делает то, что говорит ее имя.

  • Функции, которые нуждаются в частной копии, потому чтоони имеют своего рода параметр, реализованный как статические методы, которые возвращают экземпляр этого функционального интерфейса.Хорошим примером здесь является Predicate.isEqual(target), который возвращает экземпляр Predicate (object-> boolean), который возвращает true, если проверенное значение равно целевому значению (предоставляется при создании экземпляра): private static final Predicate IS_CORRECT = Predicate.isEqual(correctAnswer).

0 голосов
/ 19 декабря 2018

Сделать API как можно более практичным.Так что не добавляйте дополнительный класс, где будет достаточно статического метода или конечного поля.

enum сделает неправильный выбор.Как, например, java.nio.file.StandardCopyOption.

OTOH, нельзя использовать переменные параметры типа, если вы используете константы enum или статические поля, поэтому метод может быть предпочтительным, если только дляконсистенция.Как, например, java.util.Collections.emptySet или java.util.stream.collectors.toSet.

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

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

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