Rumah  >  Artikel  >  Java  >  Setters en un Record en Java

Setters en un Record en Java

Barbara Streisand
Barbara Streisandasal
2024-10-22 06:07:31153semak imbas

Setters en un Record en Java

A rekod ialah struktur yang dicirikan sebagai tidak boleh ubah, iaitu, sebaik sahaja objek jenis rekod telah dibuat, ia atribut tidak boleh diubah suai, ia adalah setara dengan apa yang dipanggil oleh bahasa pengaturcaraan lain data-class atau DTO (Data Transfer Object). Walau bagaimanapun, jika atribut perlu diubah suai menggunakan kaedah setter dan memandangkan setiap atribut dalam rekod adalah jenis terakhir, bagaimanakah ini boleh dicapai?

Untuk menunjukkan sama ada ini boleh, mari buat rekod Produk yang mempunyai dua atribut nama dan harga, dan kaedah masing-masing yang dibuat secara automatik apabila mentakrifkan rekod dalam Java:

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

Sekarang, jika anda mencipta objek jenis Produk dan cuba mengubah suai atribut nama, anda dapat melihat bahawa ia tidak boleh dilakukan, malah tiada kaedah penetap untuk melakukannya:

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

Tetapi, jika kita tahu bahawa rekod boleh mempunyai kaedah tambahan, maka kita boleh mencipta kaedah setName(String name) yang mengubah suai atribut nama dan memberikannya nilai baharu, kerana jawapannya tidak . , ia tidak berfungsi seperti dalam kelas biasa, contohnya:

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

Jadi bagaimana anda boleh mengubah suai atribut rekod dalam Java? Jawapannya ialah ia boleh jika kaedah set mengembalikan tika baharu rekod dengan setiap atributnya dan jelas sekali dengan atribut yang diubah suai. Proses ini boleh menjadi agak membosankan bergantung pada bilangan atribut yang rekod ada.

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

}

Dengan cara ini, apabila menggunakan mana-mana kaedah penetap, tika baharu jenis Produk dengan atribut yang diubah suai akan diperoleh, contohnya:

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

Untuk setiap objek p, q dan r, kaedah get, equals, hashCode dan toStringnya boleh digunakan secara normal, memandangkan tiada objek yang sama dengan yang lain, kerana setiap satu mempunyai nilai yang berbeza dalam atributnya.

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

Pada ketika ini, adalah penting untuk mempertimbangkan sama ada pendekatan ini sesuai untuk masalah yang diselesaikan, memandangkan rekod direka bentuk untuk menjadi struktur yang membolehkan maklumat disimpan dan diangkut secara ringkas. cara dalam aplikasi dan tidak boleh diubah, atau jika struktur dengan fleksibiliti yang lebih besar diperlukan, maka kelas harus digunakan. Untuk mendapatkan maklumat lanjut tentang masa untuk menggunakan rekod atau kelas, anda boleh merujuk siaran berikut.

Atas ialah kandungan terperinci Setters en un Record en Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:keraguan JavaArtikel seterusnya:keraguan Java