"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Setters e um registro em Java

Setters e um registro em Java

Publicado em 2024-11-08
Navegar:884

Setters en un Record en Java

Um record é uma estrutura que se caracteriza por ser imutável, ou seja, uma vez criado um objeto do tipo record ,. seus atributos não podem ser modificados, é o equivalente ao que outras linguagens de programação chamam de data-class ou DTO (Data Transfer Object). Porém, se for necessário modificar um atributo usando um método setter e considerando que cada atributo dentro do registro é do tipo final, como isso pode ser feito?

Para mostrar se isso é possível, vamos criar um registro Produto que possui dois atributos nome e preço, e os respectivos métodos que são criados automaticamente ao definir um registro em Java:

public record Product(String name, double price) { }

Agora, se você criar um objeto do tipo Produto e tentar modificar o atributo name, você pode ver que não é possível, e não existe nem um método setter para fazer isso:

Product p = new Product("Bread", 1.0);
p.setName("Water"); // Error: cannot resolve method 'setName' in 'Product'

Mas, se sabemos que um record pode ter métodos adicionais, então podemos criar um método setName(String name) que modifica o atributo name e atribui o novo valor, porque a resposta é não , não funciona como funcionaria em uma aula normal, por exemplo:

public record Product(String name, double price) {
    // Error: cannot asign a value to final variable 'name'
    public void setName(String name) {
        this.name = name;
    }
}

Então, como você pode modificar um atributo de um registro em Java? A resposta é que sim, se o método set retornar uma nova instância de record com cada um de seus atributos e, obviamente, com o(s) atributo(s) modificado(s). Este processo pode ser um pouco tedioso dependendo da quantidade de atributos que o record.
possui.

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

}

Desta forma, ao invocar qualquer um dos métodos setter, será obtida uma nova instância do tipo Produto com o atributo modificado, por exemplo:

Product p = new Product("Bread", 1.0);
Product q = p.setName("Milk");
Product r = q.setPrice(2.0);

Para cada objeto p, q e r, seus métodos get, equals, hashCode e toString podem ser invocados normalmente, considerando que nenhum dos objetos é igual ao outro, pois cada um possui um valor diferente em seus atributos.

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

Neste ponto, é importante considerar se esta abordagem é apropriada para o problema que está sendo resolvido, considerando que um registro é projetado para ser uma estrutura que permite que informações sejam armazenadas e transportadas de uma forma simples. forma dentro de uma aplicação e ser imutável, ou se uma estrutura com maior flexibilidade for necessária, então uma classe deve ser usada. Para mais informações sobre quando usar um record ou uma classe, você pode consultar o seguinte post.

Declaração de lançamento Este artigo está reproduzido em: https://dev.to/asjordi/setters-en-un-record-en-java-4fb6?1 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3