Все ли окончательный класс неизменен?
Все конечные классы в 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;
}
}