5 способов обеспечить неизменность в Java

Jan 23 2023
Неизменяемость очень желательна в программировании. Это обеспечивает предсказуемое, последовательное и безопасное поведение объектов, упрощая анализ кода, повышая производительность и гарантируя, что код станет более надежным и менее подверженным ошибкам.

Неизменяемость очень желательна в программировании. Это обеспечивает предсказуемое, последовательное и безопасное поведение объектов, упрощая анализ кода, повышая производительность и гарантируя, что код станет более надежным и менее подверженным ошибкам. Исходя из моего опыта, вот 5 способов включить неизменность в базу кода:

Фото Карла Павловича на Unsplash

1. Заключительные поля

Один из самых простых способов добиться неизменности в Java — использовать конечные поля. Поле final может быть присвоено значение только один раз, либо в конструкторе, либо во время инициализации объекта. Вот пример:

public final class Person {
  private final String firstName;
  private final String lastName;
  public Person(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  public String getFirstName() {
    return firstName;
  }
  public String getLastName() {
    return lastName;
  }
}

Одной из самых популярных библиотек для создания неизменяемых объектов в Java является библиотека Google Guava Immutables . Он позволяет создавать неизменяемые объекты простым и согласованным способом, а также поддерживает более продвинутые функции, такие как настраиваемая проверка и коллекции. Вот пример:

@Value.Immutable
public interface Person {
  String firstName();
  String lastName();
}

Используйте @NonNull, @Nullable или другие аннотации на уровне типа. Чтобы предотвратить пустые значения в полях неизменяемых объектов и сделать их явными, рекомендуется использовать аннотации на уровне типа, такие как @NonNull, @Nullable или другие, чтобы указать допустимость значений NULL для полей. Это может помочь выявить ошибки на ранней стадии и сделать код более читабельным. Вот пример:

public final class Person {
  private final @NonNull String firstName;
  private final @NonNull String lastName;
  public Person(@NonNull String firstName, @NonNull String lastName) {
    this.firstName = firstName;
    this.lastName
  }
}

Использование класса построителя для создания неизменяемых объектов — это мощная техника, позволяющая создавать сложные неизменяемые объекты с простым и согласованным интерфейсом. Класс построителя можно использовать для установки значений свойств объекта, а затем вызывается метод сборки для создания неизменяемого объекта с заданными свойствами. Это позволяет создавать неизменяемые объекты со многими необязательными полями и гарантирует, что объекты создаются согласованным образом.

@Value.Immutable
public interface Person {
    String firstName();
    String lastName();
    int age();
    String address();
    @Value.Builder
    interface Builder {
        Builder firstName(String firstName);
        Builder lastName(String lastName);
        Builder age(int age);
        Builder address(String address);
        Person build();
    }
}

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

public final class Email {
    private final String email;

    public Email(String email) {
        if (!email.matches("^[a-zA-Z0-9_!#$%&’*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$")) {
            throw new IllegalArgumentException("Invalid email address");
        }
        this.email = email;
    }

    public String getEmail() {
        return email;
    }
}

Чтобы поднять свои навыки разработки на Java на новый уровень, обязательно оформите заказ и следуйте инструкциям на сайте Effective Java !