Я думаю, что это относится к классу фабрики (который обычно является статическим методом в классе), которому не нужно создавать экземпляр этого конкретного класса. Однако я не думаю, что это определенный или обычно используемый термин.
Пример: Термин
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.
Одним из них является неизменный список. Он содержит несколько фабричных методов для конкретных случаев, например, один для пустого списка и дополнительный для списков, в которых ровно один элемент .
Я не думаю, что термин «естественный класс» является «официальным». Без контекста (и даже с ним, как мы можем видеть здесь) он не уверен, что он распознается. Поэтому я взял ваш вопрос в более широком масштабе и объяснил, о чем эта глава.