我正在阅读Joshua Blochs的“有效Java”,上面写着
静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象。这使您在选择返回对象的类时具有极大的灵活性。这种灵活性的一种应用是API可以返回对象而无需将其类公开。以这种方式隐藏实现类会产生非常紧凑的API。该技术适用于基于接口的框架,其中接口为静态工厂方法提供自然的返回类型。
谁能解释什么是“自然回报类型”?谢谢!
答案 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个工厂方法:literal
和add
,它们都返回Term
但是它的子类。术语本身不可实例化,因为它是抽象的。对于外部世界,内部类是不可见的(它们是私有的)。可访问的只是接口/抽象类Term
,这在
这种灵活性的一个应用是API可以返回对象而无需公开其类。
我认为要在此处返回的“自然类”将是Term
,而new
势必返回一个恰好是给定类型的实例。工厂方法可以返回子类型。
Guava是一个提供Java附加收集类的库。 其中之一是不可变的列表。它包含针对特定情况的多种工厂方法,例如一种for an empty list和另一种lists which exactly one element。
我不认为“自然阶级”一词是“官方的”。没有上下文(甚至有了上下文,正如我们在此处看到的那样),就不能确定它是否被识别。因此,我从更大范围考虑了您的问题,并解释了本章的内容。