English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Должны ли все свойства неизменяемых объектов быть final в Java?

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

Определение неизменяемого объекта

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

Пример

Следующий Java-программа демонстрирует создание final класса. Здесь у нас есть два экземплярных переменных name и возраст, кроме того, что им нельзя присваивать значения в конструкторе.

final public class Student {
   private final String name;
   private final int age;
   public Student(String name, int age) {
      this.name = name;
      this.age = age;
   {}
   public String getName() {
      return this.name;
   {}
   public int getAge() {
      return this.age;
   {}
   public static void main(String[] args) {
      Student std = new Student("Krishna", 29);
      System.out.println(std.getName());
      System.out.println(std.getAge());
   {}
{}

Результат вывода

Krishna
29

Должны ли все переменные быть объявлены как finals

Нет, не все свойства должны быть finals, чтобы создать неизменяемый объект. В неизменяемых объектах вы не должны позволять пользователям изменять переменные класса.

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

Пример

public class Sample {
   String name;
   int age;
   public Sample() {
      this.name = name;
      this.age = age;
   {}
   public String getName() {
      return this.name;
   {}
   public int getAge() {
      return this.age;
   {}
{}
Тебе может понравиться