Постоянный объект против неизменного объекта - PullRequest
8 голосов
/ 16 февраля 2011

Могу ли я использовать термин «постоянный объект» вместо термина «неизменный объект»?Хотя у меня возникает ощущение, что неизменным для объекта является то, что является константой для переменной, я не уверен, что эта терминология принята.Пожалуйста, помогите мне понять.

Спасибо, Картик С.

Ответы [ 5 ]

11 голосов
/ 16 февраля 2011

Фактически, в Java термин константа не имеет определенного значения.Это происходит в JLS только в более широком смысле выражение постоянной времени компиляции , которое является выражением, которое может (и должно) вычисляться компилятором, а не во время выполнения.(А ключевое слово const зарезервировано для того, чтобы компиляторы могли лучше отображать сообщения об ошибках.)

В Java вместо этого мы используем термин final для ссылки на переменные (класс, объект илилокальные), которые нельзя изменить, и неизменный , когда мы ссылаемся на объекты, которые не могут быть изменены.И то и другое можно использовать, когда речь идет о переменной x - первое означает саму переменную (то есть ее нельзя переключить на другой объект), второе означает объект, стоящий за переменной.Таким образом, здесь два значения являются ортогональными и часто объединяются для создания «истинной постоянной» .

4 голосов
/ 16 февраля 2011

Я бы прочитал константу как один и тот же объект (ту же ссылку), тогда как неизменный явно означает для меня тот факт, что объект не меняется.

Поскольку это две разные вещи, я бы, возможно, сослался на это:

private final Immutable i = new Immutable();

как постоянный неизменный объект.

1 голос
/ 16 февраля 2011

Константа часто имеет очень специфическое значение в разных языках программирования.В Java константа уже ссылается на постоянную переменную, переменную, которая не может быть изменена после присваивания, например:

final int FOO = 1;
FOO = 4; // constant variable cannot be changed.

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

1 голос
/ 16 февраля 2011

Они очень близки по смыслу, понимая, что Объект содержит методы, а Константа, как обычно считается, содержит только данные.

В Java есть дополнительное рассмотрение ключевого слова final, которое в основном означает не переназначаемый. Некоторые люди будут случайно называть конечную переменную константой (поскольку ее ссылка на конкретный объект является константой. Это часто происходит из-за путаницы в отношении конкретных ролей члена и объекта, к которому он относится, в 95% случаев человек делает это, чтобы ссылаться на неизменный объект.

Не каждый метод должен возвращать данные, которые полностью зависят от внутренних членов. Например, System.currentTimeMillis() возвращает метку времени в стиле Unix, но при этом не нужно менять фактический объект "System".

0 голосов
/ 16 февраля 2011

Неизменяемость объекта означает, что он не может преобразовать свое состояние ... т.е. не может мутировать ... Например:

final class Person {
  private int age = 0;

  public Person(int age) { this.age = age; }
}

Объекты этого типа являются неизменяемыми объектами, поскольку вы не можетеизменить его состояние .... (на мгновение забудь о Reflection)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...