5 способов обеспечить неизменность в Java
Неизменяемость очень желательна в программировании. Это обеспечивает предсказуемое, последовательное и безопасное поведение объектов, упрощая анализ кода, повышая производительность и гарантируя, что код станет более надежным и менее подверженным ошибкам. Исходя из моего опыта, вот 5 способов включить неизменность в базу кода:
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 !

![В любом случае, что такое связанный список? [Часть 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































