Почему у java.time.Period нет конструктора?
Вместо этого необходимо использовать Period.of(int, int, int) или другой статический метод в том же духе.
В чем причина этого?
2 ответа
Основная причина - это класс утилит, и большинство классов утилит следует использовать статически (по крайней мере, так желают Java-архитекторы). Вы можете сравнить это с использованием java.lang.Math.
Вторая причина, которую я предлагаю, - это отражение и сериализация. Я думаю, что иметь дело с Period.class более удобно, но это всего лишь предложение. Внутри реализации они имеют статический метод create() и всегда используют create() вместо конструктора.
Вы также можете посмотреть на исходный код. Например, здесь: http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/e63cf6b55a95/src/java.base/share/classes/java/time/Period.java
public static final Period ZERO = new Period(0, 0, 0);
public static Period of(int years, int months, int days) {
return create(years, months, days);
}
private static Period create(int years, int months, int days) {
if ((years | months | days) == 0) {
return ZERO;
}
return new Period(years, months, days);
}
private Period(int years, int months, int days) {
this.years = years;
this.months = months;
this.days = days;
}
Период является последним классом, поэтому не может быть продлен, поэтому каждый может сделать этот период неизменным. Закрытый конструктор - это еще один способ убедиться, что период будет создан правильно.