Почему объекты Джоды неизменяемы? - программирование
Подтвердить что ты не робот

Почему объекты Джоды неизменяемы?

Я читал, что с версией Java меньше 7, объекты Joda Time более надежны, чем встроенные Java-модули. Одна из причин заключается в том, что объекты Джоды неизменяемы. Почему это выгодно? Если я хочу изменить год, час и часовой пояс объекта Joda DateTime, мне нужно сделать три копии!

4b9b3361

Ответ 1

Если я хочу изменить год, час и часовой пояс объекта Joda DateTime, мне нужно сделать три копии!

Да, действительно. Или вы можете создать один новый объект, конечно, используя все поля, которые вам нравятся со старого объекта.

Это очень хорошая вещь, потому что это означает, что если вы хотите полагаться на объект, который не меняется, он не будет. Рассмотрим этот псевдокод:

private static final Instant EARLIEST_ALLOWED_ARTICLE = ...;

private Instant creationTimestamp;

public Article(Instant creationTimestamp, ...) {
    if (creationTimestamp.isBefore(EARLIEST_ALLOWED_ARTICLE)) {
        throw new IllegalArgumetnException(...);
    }
    this.creationTimestamp = creationTimestamp;
    ...
}

Это прекрасно, потому что Instant является неизменным. Если бы он был изменен, валидация в конструкторе была бы бесполезной - если вы не создали защитную копию в этой точке.

По моему опыту вы хотите передать ссылки и знать, что значения не изменятся больше, чем вы хотите на самом деле внести изменения в существующие объекты, поэтому неизменность приводит к меньшему количеству ошибок (с изменяемыми объектами, которые вы можете забыть взять копия, и любая валидация тогда бесполезна) и меньшее количество сделанных копий.

В принципе, это позволяет вам рассуждать о вашем коде локально, не делая копии всего, что вы либо принимаете, и сохраняете, либо возвращаете в другой код. Когда только ваш код может изменить состояние вашего объекта, гораздо проще выработать то, что произойдет со временем.

Время Joda на самом деле несколько не срабатывает, поскольку оно имеет как изменяемые, так и неизменные типы. Если вы просто программируете интерфейс (например, ReadableInstant), вы не получите эти гарантии. Вот почему в Noda Time я сделал все типы подлинно неизменными.

Из интереса вы хотите, чтобы String изменялся? Если нет, попробуйте подумать, существуют ли реальные различия между этими двумя сценариями.

Ответ 2

Самый простой ответ: когда вы создаете объект, вы знаете, что он не может измениться. Это означает, что вы не столкнетесь с ситуацией, когда ваши данные изменяются неожиданными способами (возможно, в других частях кода или разных потоках).

Это делает поведение объекта более предсказуемым и надежным.

Ответ 3

Там может быть много причин, но один хороший приветствует хеширование. Неизменяемые объекты могут использоваться в хэш-структурах данных (например, HashSet, ключи в HashMaps и т.д.), Потому что их хэш-код и семантика равенства не будут меняться. Мутируемые объекты не подходят для хэширования, поскольку мутации могут изменять их хэш-код или равенство.

Сделав даты Joda неизменяемыми, они теперь могут использоваться в структурах хэширования данных.

Ответ 4

Я бы предположил, что из-за этого:

Представьте, что у вас есть объект java.util.Date, который используется в нескольких классах. Я занимаюсь разработкой на одном классе, вы с другой. Затем я решаю, что мне нужно предсказать будущее, но вместо создания нового объекта Date я беру тот, который у меня уже есть, тот, который, по вашему мнению, представляет определенный момент времени, и добавляю к нему три часа. Теперь ваш код может столкнуться с серьезными проблемами во время выполнения. Этого можно избежать, используя неизменяемый объект, потому что вы не можете изменить его состояние, вы не можете испортить его для кого-либо еще.