Что такое естественный тип возврата в Java? - PullRequest
0 голосов
/ 03 января 2019

Я читаю Джошуа Блохса "Эффективная Ява", и там написано

Третье преимущество статических фабричных методов заключается в том, что, в отличие от конструкторов, они могут возвращать объект любого подтипа своего возвращаемого типа. Это дает вам большую гибкость в выборе класса возвращаемого объекта. Одним из применений этой гибкости является то, что API может возвращать объекты, не делая их классы общедоступными. Сокрытие классов реализации таким способом приводит к очень компактному API. Этот метод подходит для основанных на интерфейсе сред, где интерфейсы предоставляют естественные типы возврата для статических фабричных методов.

Может кто-нибудь объяснить, что такое "естественные типы возврата"? Спасибо!

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Я думаю, что это относится к классу фабрики (который обычно является статическим методом в классе), которому не нужно создавать экземпляр этого конкретного класса. Однако я не думаю, что это определенный или обычно используемый термин.

Пример: Термин

public abstract class Term {

    public abstract Integer evaluate();

    static Term literal(Integer number) {
        return new Literal(number);
    }

    static Term add(Term left, Term right) {
        return new Addition(left, right);
    }

    private static class Addition extends Term {
        private Term left;
        private Term right;

        public Addition(Term left, Term right) {
            this.left = left;
            this.right = right;
        }

        @java.lang.Override
        public Integer evaluate() {
            return left + right;
        }
    }

    private static class Literal extends Term {
        private Integer number;

        public Literal(Integer number) {
            this.number = number;
        }

        @java.lang.Override
        public Integer evaluate() {
            return number;
        }
    }
}

Это класс с именем Term с двумя фабричными методами: literal и add, которые оба возвращают Term, но его подкласс. Сам термин не является инстанцируемым, потому что он абстрактный. Для внешнего мира внутренние классы не видны (они являются частными). Доступен только интерфейс / абстрактный класс Term, на который ссылается

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

Я думаю, что "естественный класс" для возврата будет Term, а new обязательно вернет экземпляр именно данного типа. Фабричный метод может возвращать подтипы.

Пример: гуава

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

Я не думаю, что термин «естественный класс» является «официальным». Без контекста (и даже с ним, как мы можем видеть здесь) он не уверен, что он распознается. Поэтому я взял ваш вопрос в более широком масштабе и объяснил, о чем эта глава.

0 голосов
/ 03 января 2019

Конкретным примером этого будет что-то вроде ImmutableList фабричных методов Гуавы.

Это имеет 13 перегрузок метода of с увеличением числа параметров. Если вы посмотрите на источник первых 3 :

@SuppressWarnings("unchecked")
public static <E> ImmutableList<E> of() {
  return (ImmutableList<E>) EMPTY;
}

public static <E> ImmutableList<E> of(E element) {
  return new SingletonImmutableList<E>(element);
}

public static <E> ImmutableList<E> of(E e1, E e2) {
  return construct(e1, e2);
}

Методы zero-arg и two-arg фактически возвращают экземпляр RegularImmutableList, который является подклассом ImmutableList; метод one-arg возвращает экземпляр SingletonImmutableList.

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

«Естественный» в этом смысле, возможно, означает «на соответствующем уровне абстракции».

0 голосов
/ 03 января 2019

В этом контексте «естественный» просто означает естественный для контекста фабричного метода;то есть что уместно или что вы ожидаете.Интуитивно понятным будет другой синоним.

Это обычное употребление английского языка ... не терминология, связанная с ИТ или Java.

...