record — это структура, которая характеризуется неизменяемостью, то есть после создания объекта типа record . его атрибуты не могут быть изменены, это эквивалент того, что другие языки программирования называют классом данных или DTO (объект передачи данных). Однако если атрибут необходимо изменить с помощью метода setter и учитывая, что каждый атрибут в записи имеет окончательный тип, как этого можно добиться?
Чтобы показать, возможно ли это, давайте создадим запись Product, имеющую два атрибута: имя и цену, а также соответствующие методы, которые автоматически создаются при определении записи в Java:
public record Product(String name, double price) { }
Теперь, если вы создадите объект типа Product и попытаетесь изменить атрибут name, вы увидите, что это невозможно, и для этого не существует даже метода setter:
Product p = new Product("Bread", 1.0); p.setName("Water"); // Error: cannot resolve method 'setName' in 'Product'
Но если мы знаем, что запись может иметь дополнительные методы, тогда мы можем создать метод setName(String name), который изменяет атрибут name и присваивает новое значение, потому что ответ — no , это не работает так, как в обычном классе, например:
public record Product(String name, double price) { // Error: cannot asign a value to final variable 'name' public void setName(String name) { this.name = name; } }
Так как же можно изменить атрибут записи в Java? Ответ заключается в том, что это возможно, если метод set возвращает новый экземпляр record с каждым из его атрибутов и, очевидно, с измененными атрибутами. Этот процесс может быть немного утомительным в зависимости от количества атрибутов, которые имеет запись.
.
public record Product(String name, double price) { public Product setName(String name) { return new Product(name, this.price); } public Product setPrice(double price) { return new Product(this.name, price); } }
Таким образом, при вызове любого из методов setter будет получен новый экземпляр типа Product с измененным атрибутом, например:
Product p = new Product("Bread", 1.0); Product q = p.setName("Milk"); Product r = q.setPrice(2.0);
Для каждого объекта p, q и r его методы get, equals, hashCode и toString могут быть вызваны обычным способом, учитывая, что ни один из объектов не равен другому, поскольку каждый из них имеет разные значения в своих атрибутах.
public class Main { public static void main(String[] args) { Product p = new Product("Bread", 1.0); Product q = p.setName("Milk"); Product r = q.setPrice(2.0); System.out.println(p); // Product[name=Bread, price=1.0] System.out.println(q); // Product[name=Milk, price=1.0] System.out.println(r); // Product[name=Milk, price=2.0] System.out.println(p.equals(q)); // false System.out.println(q.equals(r)); // false System.out.println(r.equals(p)); // false } }
На этом этапе важно рассмотреть, подходит ли этот подход для решаемой проблемы, учитывая, что запись спроектирована как структура, позволяющая хранить и транспортировать информацию в простом виде. внутри приложения и быть неизменяемым, или, если требуется структура с большей гибкостью, следует использовать класс. Для получения дополнительной информации о том, когда использовать запись или класс, вы можете прочитать следующий пост.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3