Java中的自然返回类型是什么?

时间:2019-01-02 23:18:07

标签: java return return-value factory

我正在阅读Joshua Blochs的“有效Java”,上面写着

  

静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象。这使您在选择返回对象的类时具有极大的灵活性。这种灵活性的一种应用是API可以返回对象而无需将其类公开。以这种方式隐藏实现类会产生非常紧凑的API。该技术适用于基于接口的框架,其中接口为静态工厂方法提供自然的返回类型。

谁能解释什么是“自然回报类型”?谢谢!

3 个答案:

答案 0 :(得分:2)

在这种情况下,“自然”仅表示工厂方法环境中的自然;即什么是合适的或您期望的。直观将是另一个同义词。

这只是普通的英语用法,不是IT或Java专用术语。

答案 1 :(得分:2)

一个具体的例子就是类似Guava的ImmutableList工厂方法。

这有13个of方法的重载,并且参数数量不断增加。如果您查看the source of the first 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的引用。

从这个意义上说,“自然”也许意味着“处于适当的抽象水平”。

答案 2 :(得分:1)

我认为它引用工厂的类(通常是该类中的静态方法),而无需实例化此特定类。但是,我认为这不是一个定义的或常用的术语。

示例:术语

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的类,具有2个工厂方法:literaladd,它们都返回Term但是它的子类。术语本身不可实例化,因为它是抽象的。对于外部世界,内部类是不可见的(它们是私有的)。可访问的只是接口/抽象类Term,这在

  

这种灵活性的一个应用是API可以返回对象而无需公开其类。

我认为要在此处返回的“自然类”将是Term,而new势必返回一个恰好是给定类型的实例。工厂方法可以返回子类型。

示例:番石榴

Guava是一个提供Java附加收集类的库。 其中之一是不可变的列表。它包含针对特定情况的多种工厂方法,例如一种for an empty list和另一种lists which exactly one element

我不认为“自然阶级”一词是“官方的”。没有上下文(甚至有了上下文,正如我们在此处看到的那样),就不能确定它是否被识别。因此,我从更大范围考虑了您的问题,并解释了本章的内容。