«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Сеттеры и запись на Java

Сеттеры и запись на Java

Опубликовано 8 ноября 2024 г.
Просматривать:343

Setters en un Record en Java

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
    }
}

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

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/asjordi/setters-en-un-record-en-java-4fb6?1. Если обнаружено какое-либо нарушение прав, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3