Почему у 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;
}

Период является последним классом, поэтому не может быть продлен, поэтому каждый может сделать этот период неизменным. Закрытый конструктор - это еще один способ убедиться, что период будет создан правильно.

Другие вопросы по тегам