Все ли окончательный класс неизменен?

Все конечные классы в Java неизменяемы. String и Integer оба являются конечными классами, и оба являются неизменными, и я верю.

Ответы

Ответ 1

Нет - последний класс означает, что вы не можете наследовать его. Это не имеет ничего общего с изменчивостью. Следующий класс является окончательным, но изменяемым:

public final class FinalMutable {
  int value;
  public void setValue(int v) { value=v; }
  public int getValue() { return value; }
}

Ответ 2

Нет, окончательный означает, что класс не может быть расширен. В нем ничего не говорится об изменчивости. Например:

final class MutInt {
   public int modifyMe;
}

Ответ 3

Нет ключевого слова для неизменяемости, это больше похоже на шаблон дизайна.

EDIT:
Это означает, что ключевое слово отсутствует, что делает класс неизменным. Чтобы сделать класс неизменным, вы должны защитить внутренности, сделав их окончательными или частными.

Заблуждение заключается в следующем: последнее ключевое слово имеет разные значения при использовании в классе, а затем оно используется при использовании в поле/переменной. Первое означает, что "этот класс нельзя продлить". Второй означает, что "эта переменная (или ссылка) не может быть изменена".

Ответ 4

В дополнение к другим ответам, если вы посмотрите на код для java.lang.String, вы увидите, что оно содержит поле: hash, которое изменено, и на самом деле вычисляется и сохраняется, когда hashCode() вызывается в первый раз.

Тем не менее, класс по-прежнему неизменный: поле hash невозможно получить напрямую или изменить вне класса.

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

private final List<String> values;

public List<? get String> getValues() {
  return Collections.unmodifiableList(values);
}

Ответ 5

Как было сказано другими, до того, как final не делает класс imuutable в Java, хотя он играет роль в стратегии неизменности. Чтобы получить неизменность, вы должны следовать общим рекомендациям:

  • гарантировать, что класс нельзя переопределить - сделайте класс final или используйте статические фабрики и сохраните конструкторы private
  • введите поля private и final
  • принудительно создавать объекты полностью за один шаг, вместо использования конструктора без аргументов в сочетании с последующими вызовами методов setXXX (т.е. избегать соглашения Java Beans)
  • не предоставляют никаких методов, которые могут каким-либо образом изменить состояние объекта, а не только методы setXXX, но любой метод, который может изменить состояние
  • Если класс имеет какие-либо изменчивые поля объекта, то они должны быть защищены при передаче между классом и его вызывающим

Ответ 6

В частном поле нельзя получить доступ к переопределенным методам подкласса... Таким образом, методы подкласс не изменяют частное поле суперкласса... Тогда в чем смысл использования неизменяемого класса как окончательного

Ответ 7

Конечные ключевые слова не позволяют другим классам наследовать его. Конечное ключевое слово не делает его неизменным, но есть такое условие, что делает члены класса экземпляра приватными, а также окончательными, и используя геттеры и не используя сеттеры.

Ответ 8

Окончательные неизменяемые классы не могут быть видоизменены. Здесь ниже это показывает, что не окончательный неизменяемый класс видоизменяется:

// a class not intended to be mutated 
public class GoodClass{

   private String name;

   public GoodClass() {
       this.name = "Good Class Neme";
   }

   public String getName() {
       return name;
   }
}

public class BadClass extends GoodClass {

   private String name;

   public String getName() {
       return name;
   }

   // mutating state
   public void setName(String name) {
       this.name = name;
   }
}