JavaRush /Blog Java /Random-MS /Rehat kopi #230. Apakah Rekod di Jawa dan bagaimana ia be...

Rehat kopi #230. Apakah Rekod di Jawa dan bagaimana ia berfungsi?

Diterbitkan dalam kumpulan
Sumber: JavaTechOnline Artikel ini memberikan pandangan yang mendalam tentang konsep Rekod dalam Java dengan contoh, termasuk sintaksnya, cara menciptanya dan cara menggunakannya. Rehat kopi #230.  Apakah Rekod di Jawa dan bagaimana ia berfungsi - 1Rekod di Java ialah salah satu ciri hebat yang mula-mula diperkenalkan di Java 14 sebagai ciri pratonton dan akhirnya keluar dalam keluaran Java 17. Ramai pembangun secara aktif menggunakannya, yang membantu mereka berjaya mengurangkan sejumlah besar kod boilerplate. Selain itu, terima kasih kepada rekod, anda tidak perlu menulis satu baris kod untuk menjadikan kelas tidak berubah.

Bila hendak menggunakan Rekod dalam Java?

Jika anda ingin menghantar data tidak berubah antara lapisan aplikasi anda yang berbeza, maka menggunakan Rekod boleh menjadi pilihan yang baik. Secara lalai, Rekod dalam Java tidak boleh diubah, yang bermaksud bahawa kita tidak boleh menukar sifatnya sebaik sahaja ia dibuat. Akibatnya, ini membantu kami mengelakkan ralat dan meningkatkan kebolehpercayaan kod. Ringkasnya, menggunakan Rekod dalam Java, kami boleh menjana kelas secara automatik.

Di manakah saya boleh menggunakan Rekod dalam Java?

Secara amnya, kami boleh menggunakan rekod dalam sebarang situasi di mana kami perlu mengisytiharkan bekas data mudah dengan sifat tidak berubah dan kaedah yang dijana secara automatik. Sebagai contoh, di bawah ialah beberapa kes penggunaan yang mana rekod boleh berguna: Objek pemindahan data (DTO): Kami boleh menggunakan Rekod untuk mengisytiharkan objek pemindahan data mudah yang mengandungi data. Ini berguna apabila memindahkan data antara lapisan aplikasi yang berbeza, seperti antara lapisan perkhidmatan dan lapisan pangkalan data. Objek Konfigurasi : Rekod boleh digunakan untuk mengisytiharkan objek konfigurasi yang mengandungi set sifat konfigurasi untuk aplikasi atau modul. Objek ini biasanya mempunyai sifat tidak berubah, menjadikannya selamat untuk benang dan mudah digunakan. Objek nilai. Rekod boleh digunakan untuk mengisytiharkan objek nilai yang mengandungi set nilai yang mewakili konsep atau model domain tertentu. Respons API : Apabila membuat API REST, data biasanya dikembalikan dalam bentuk JSON atau XML. Dalam kes sedemikian, anda mungkin perlu menentukan struktur data ringkas yang mewakili respons API. Rekod sesuai untuk ini kerana ia membolehkan anda menentukan struktur data yang ringan dan tidak berubah yang boleh disirikan dengan mudah kepada JSON atau XML. Data ujian. Apabila menulis ujian unit, anda selalunya perlu mencipta data ujian yang mewakili senario tertentu. Dalam kes sedemikian, anda mungkin perlu menentukan struktur data ringkas yang mewakili data ujian. Rekod boleh menjadi ideal untuk ini kerana ia membolehkan kami mentakrifkan struktur data yang ringan dan tidak berubah dengan kod boilerplate yang minimum. Objek seperti Tuple : Rekod boleh digunakan untuk mengisytiharkan objek seperti Tuple yang mengandungi bilangan tetap nilai yang berkaitan. Ini boleh berguna apabila mengembalikan berbilang nilai daripada kaedah atau apabila bekerja dengan koleksi nilai yang berkaitan.

Apakah Rekod di Jawa?

Rekod dalam Java ialah kelas yang direka untuk menyimpan data. Ia serupa dengan kelas Java tradisional, tetapi lebih ringan dan mempunyai beberapa ciri unik. Rekod tidak boleh diubah secara lalai, yang bermaksud keadaannya tidak boleh diubah setelah ia dibuat. Ini menjadikan mereka sesuai untuk menyimpan data tidak berubah, seperti parameter konfigurasi atau nilai yang dikembalikan daripada pertanyaan pangkalan data. Ia juga merupakan satu cara untuk mencipta jenis data tersuai yang terdiri daripada satu set medan atau pembolehubah, serta kaedah untuk mengakses dan mengubah suai medan tersebut. Rekod dalam Java menjadikan kerja dengan data lebih mudah dengan mengurangkan jumlah kod boilerplate yang perlu ditulis berulang kali oleh pembangun. Sintaks untuk membuat entri dalam Java ialah:
record Record_Name(Fields....)

Bagaimana untuk mencipta dan menggunakan Rekod dalam Java dengan contoh?

Mari lihat cara membuat dan menggunakan rekod dalam Java secara pemrograman.

Mencipta Rekod

Mencipta rekod secara pemrograman tidak begitu serupa dengan mencipta kelas biasa di Jawa. Daripada kelas kami menggunakan kata kunci rekod . Anda juga perlu mengisytiharkan medan dengan jenis data dalam kurungan nama rekod. Berikut ialah contoh kod yang menunjukkan cara membuat entri dalam Java:
public record Book(String name, double price) { }
Dalam contoh ini, kami mencipta rekod yang dipanggil Buku dengan dua medan: nama dan harga . Kata kunci awam menunjukkan bahawa entri ini boleh diakses di luar pakej di mana ia ditakrifkan.

Menggunakan Rekod

Untuk menggunakan rekod dalam Java, kita boleh membuat instantiate menggunakan kata kunci baharu, sama seperti yang kita lakukan dengan kelas biasa. Berikut ialah contoh:
Book book = new Book( "Core Java" , 324.25);
Di sini contoh rekod Buku baharu dibuat dengan medan nama ditetapkan kepada Java Teras dan medan harga ditetapkan kepada 324.25 . Setelah rekod dibuat, medannya boleh diakses menggunakan nama medan itu sendiri. Tiada kaedah dapatkan atau tetapkan. Sebaliknya, nama medan menjadi nama kaedah.
String name = book.name();

double price = book.price();
Di sini kita melihat nilai medan nama dan harga diambil daripada rekod Buku . Selain medan, rekod juga mempunyai beberapa kaedah terbina dalam yang boleh anda gunakan untuk memanipulasinya. Contohnya, toString() , equals() dan hashCode() . Ingat bahawa rekod Java tidak boleh diubah secara lalai, yang bermaksud bahawa sebaik sahaja ia dibuat, keadaannya tidak boleh diubah. Mari lihat satu lagi contoh cara membuat dan menggunakan rekod dalam Java. Mari kita ambil satu kes di mana kita memerlukan rekod untuk menyimpan maklumat tentang pelajar.
public record Student(String name, int age, String subject) {}
Ini mencipta rekod yang dipanggil Pelajar dengan tiga medan: nama , umur dan subjek . Kita boleh membuat contoh entri ini seperti berikut:
Student student = new Student("John Smith", 20, "Computer Science");
Kami kemudiannya boleh mendapatkan nilai medan menggunakan nama medan:
String name = student.name();
int age = student.age();
String subject= student.subject();

Apakah rupa Rekod selepas penyusunan?

Memandangkan Rekod hanyalah jenis kelas istimewa, pengkompil juga menukarnya menjadi kelas biasa, tetapi dengan beberapa sekatan dan perbezaan. Apabila pengkompil menukar rekod (fail Java) kepada kod bait selepas proses penyusunan, fail .class yang dihasilkan mengandungi beberapa pengisytiharan tambahan kelas Rekod . Sebagai contoh, di bawah ialah kod bait yang dijana untuk entri Pelajar oleh pengkompil Java:
record Student(String name, int age) {   }

Menulis ke fail .class (selepas penyusunan)

Kami juga boleh mencari kelas yang ditukar di bawah jika kami menggunakan alat javap dan menggunakan arahan di bawah dari baris arahan. Adalah penting untuk ambil perhatian bahawa baris arahan Java termasuk alat javap , yang boleh anda gunakan untuk melihat maklumat tentang medan, pembina dan kaedah fail kelas. > javap Kesimpulan Pelajar: Jika kita menyemak bytecode dengan teliti, kita mungkin mempunyai beberapa pemerhatian:
  • Pengkompil menggantikan kata kunci Rekod dengan kelas .
  • Pengkompil mengisytiharkan kelas akhir . Ini menunjukkan bahawa kelas ini tidak boleh dilanjutkan. Ini juga bermakna ia tidak boleh diwarisi dan sifatnya tidak berubah.
  • Kelas yang ditukar memanjangkan java.lang.Record . Ini menunjukkan bahawa semua rekod adalah subkelas bagi kelas Rekod yang ditakrifkan dalam pakej java.lang .
  • Pengkompil menambah pembina parameter.
  • Pengkompil secara automatik menjana kaedah toString() , hashCode() dan equals() .
  • Pengkompil telah menambah kaedah untuk mengakses medan. Beri perhatian kepada konvensyen penamaan kaedah - ia betul-betul sama dengan nama medan, tidak sepatutnya ada get atau set sebelum nama medan .

Medan dalam Rekod

Rekod dalam Java mentakrifkan keadaan mereka menggunakan satu set medan, setiap satu dengan nama dan jenis yang berbeza. Medan rekod diisytiharkan dalam pengepala rekod. Sebagai contoh:
public record Person(String name, int age) {}
Entri ini mempunyai dua medan: nama jenis String dan umur jenis int . Medan rekod adalah muktamad secara tersirat dan tidak boleh ditugaskan semula selepas rekod dibuat. Kami boleh menambah medan baharu, tetapi ini tidak disyorkan. Medan baharu yang ditambahkan pada rekod mestilah statik. Sebagai contoh:
public record Person(String name, int age) {

   static String sex;
}

Pembina dalam Rekod

Seperti pembina kelas tradisional, pembina rekod digunakan untuk mencipta kejadian rekod. Rekod mempunyai dua konsep pembina: pembina kanonik dan pembina padat . Pembina padat menyediakan cara yang lebih ringkas untuk memulakan pembolehubah keadaan dalam rekod, manakala pembina kanonik menyediakan cara yang lebih tradisional dengan lebih fleksibiliti.

Pembina kanonik

Pengkompil Java lalai memberikan kita pembina semua argumen (pembina semua medan) yang memberikan argumennya kepada medan yang sepadan. Ia dikenali sebagai pembina kanonik. Kami juga boleh menambah logik perniagaan seperti pernyataan bersyarat untuk mengesahkan data. Di bawah adalah contoh:
public record Person(String name, int age) {

       public Person(String name, int age) {
           if (age < 18) {
              throw new IllegalArgumentException("You are not allowed to participate in general elections");
           }
      }
}

Pereka bentuk padat

Pembina padat mengabaikan semua hujah, termasuk kurungan. Medan yang sepadan ditetapkan secara automatik. Sebagai contoh, kod berikut menunjukkan konsep pembina padat dalam Rekod :
public record Person(String name, int age) {

      public Person {
          if (age < 18) {
              throw new IllegalArgumentException("You are not allowed to participate in general elections");
          }
     }
}
Sebagai tambahan kepada pembina kompak, anda boleh menentukan pembina biasa dalam Record , sama seperti dalam kelas biasa. Walau bagaimanapun, anda perlu memastikan bahawa semua pembina memulakan semua medan rekod.

Kaedah dalam Rekod

Rekod dalam Java secara automatik menjana satu set kaedah untuk setiap medan dalam rekod. Kaedah ini dipanggil kaedah pengakses dan mempunyai nama yang sama dengan medan yang dikaitkan dengannya. Sebagai contoh, jika rekod mempunyai medan bernama price , maka ia secara automatik akan mempunyai kaedah yang dipanggil price() yang mengembalikan nilai medan harga . Selain kaedah pengakses yang dijana secara automatik, kami juga boleh menentukan kaedah kami sendiri dalam entri, sama seperti dalam kelas biasa. Sebagai contoh:
public record Person(String name, int age) {
   public void sayHello() {
      System.out.println("Hello, my name is " + name);
   }
}
Entri ini mempunyai kaedah sayHello() yang mencetak ucapan menggunakan medan nama .

Bagaimana Record membantu mengurangkan kod boilerplate

Mari lihat contoh mudah untuk melihat bagaimana notasi Java boleh membantu menghapuskan kod boilerplate. Katakan kita mempunyai kelas yang dipanggil Orang yang mewakili seseorang dengan nama, umur dan alamat e-mel. Inilah cara kami mentakrifkan kelas dengan cara tradisional. Kod tanpa menggunakan Rekod :
public class Person {

    private String name;
    private int age;
    private String email;

    public Person(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    public String getName() {

       return name;
    }

    public int getAge() {
       return age;
    }

    publicString getEmail() {
       return email;
    }

    public void setName(String name) {
       this.name = name;
    }

    public voidsetAge(int age) {
       this.age = age;
    }

    public void setEmail(String email) {
       this.email = email;
    }

    @Override
    public String toString() {
       return "Person{" +
         "name='" + name + '\'' +
         ", age=" + age +
         ", email='" + email + '\'' +
      '}';
    }
}
Seperti yang kita dapat lihat, kelas ini memerlukan banyak kod boilerplate untuk menentukan medan, pembina, getter, setter dan kaedah toString() . Selain itu, katakan kita mahu menjadikan kelas ini tidak berubah. Untuk melakukan ini kita perlu melakukan beberapa langkah tambahan seperti:
  • Istiharkan kelas sebagai muktamad supaya ia tidak boleh dilanjutkan.
  • Isytiharkan semua medan peribadi dan muktamad supaya ia tidak boleh diubah di luar pembina.
  • Jangan berikan sebarang kaedah penetap untuk medan.
  • Jika mana-mana medan boleh berubah, anda harus mengembalikan salinannya dan bukannya mengembalikan objek asal.
Kod menggunakan Rekod :
public record Person(String name, int age, String email) {}
Itu sahaja! Dengan hanya satu baris kod, kami telah menentukan kelas yang mempunyai kaedah medan, pembina, getter, setter dan toString() yang sama sebagai kelas tradisional. Sintaks Rekod menjaga semua kod boilerplate untuk kami. Daripada contoh di atas, jelas bahawa menggunakan rekod dalam Java boleh membantu menghapuskan kod boilerplate dengan menyediakan sintaks yang lebih ringkas untuk menentukan kelas dengan set medan tetap. Kurang kod diperlukan untuk mentakrif dan menggunakan rekod daripada pendekatan tradisional, dan rekod menyediakan akses terus ke medan menggunakan kaedah untuk mengemas kini medan. Ini menjadikan kod lebih mudah dibaca, boleh diselenggara dan kurang terdedah kepada ralat. Selain itu, dengan Record syntax , kita tidak perlu melakukan apa-apa tambahan untuk menjadikan kelas tidak berubah. Secara lalai, semua medan dalam rekod adalah muktamad dan kelas rekod itu sendiri tidak boleh diubah. Oleh itu, mencipta kelas tidak berubah menggunakan sintaks tulis adalah lebih mudah dan memerlukan kurang kod daripada pendekatan tradisional. Dengan rekod, kami tidak perlu mengisytiharkan medan sebagai final , menyediakan pembina yang memulakan medan atau menyediakan getter untuk semua medan.

Kelas Rekod Biasa

Java juga boleh mentakrifkan kelas Rekod generik . Kelas kemasukan generik ialah kelas kemasukan yang mempunyai satu atau lebih jenis parameter. Berikut adalah contoh:
public record Pair<T, U>(T first, U second) {}
Dalam contoh ini , Pair ialah kelas rekod generik yang mengambil dua parameter jenis T dan U . Kita boleh membuat contoh rekod ini seperti berikut:
Pair<String, Integer>pair = new Pair<>( "Hello" , 123);

Kelas bersarang di dalam Rekod

Anda juga boleh menentukan kelas dan antara muka bersarang dalam entri. Ini berguna untuk mengumpulkan kelas dan antara muka yang berkaitan, dan boleh membantu meningkatkan organisasi dan kebolehselenggaraan pangkalan kod anda. Berikut ialah contoh entri yang mengandungi kelas bersarang:
public record Person(String name, int age, Contact contact){

    public static class Contact {

       private final String email;
       private final String phone;

       public Contact(String email, String phone){
           this.email = email;
           this.phone = phone;
       }

       public String getEmail(){
          return email;
       }

       public String getPhone(){
          return phone;
       }
    }
}
Dalam contoh ini, Orang ialah entri yang mengandungi kelas Kenalan bersarang . Sebaliknya, Kenalan ialah kelas bersarang statik yang mengandungi dua medan akhir peribadi: alamat e-mel dan telefon. Ia juga mempunyai pembina yang menerima e-mel dan nombor telefon, dan dua kaedah getter: getEmail() dan getPhone() . Kita boleh membuat contoh Orang seperti ini:
Person person = new Person("John",30, new Person.Contact("john@example.com", "123-456-7890"));
Dalam contoh ini, kami mencipta objek Orang baharu bernama John , umur 30 tahun dan objek Kenalan baharu dengan e-mel john@example.com dan telefon 123-456-7890 .

Antara muka bersarang di dalam Rekod

Berikut ialah entri contoh yang mengandungi antara muka bersarang:
public record Book(String title, String author, Edition edition){
    public interface Edition{
       String getName();
   }
}
Dalam contoh ini, Buku ialah entri yang mengandungi antara muka Edisi bersarang . Sebaliknya, Edisi ialah antara muka yang mentakrifkan satu kaedah getName() . Kita boleh membuat contoh Buku seperti berikut:
Book book = new Book("The Hitchhiker's Guide to the Galaxy", "Douglas Adams", new Book.Edition() {

   public String getName() {

      return "Science Fiction";
   }
});
Dalam contoh ini, kami mencipta objek Buku baharu dengan tajuk The Hitchhiker's Guide to the Galaxy oleh Douglas Adams dan pelaksanaan tanpa nama baharu bagi antara muka Edisi yang mengembalikan nama Fiksyen Sains apabila kaedah getName() dipanggil .

Apa lagi yang boleh dilakukan oleh Rekod?

  • Entri boleh menentukan pembina tersuai. Rekod menyokong pembina berparameter, yang boleh memanggil pembina lalai dengan parameter yang disediakan dalam badan mereka. Selain itu, rekod juga menyokong pembina kompak, yang serupa dengan pembina lalai tetapi boleh menyertakan fungsi tambahan seperti semakan dalam badan pembina.
  • Seperti mana-mana kelas lain di Java, Rekod boleh mentakrifkan dan menggunakan kaedah contoh. Ini bermakna kita boleh mencipta dan memanggil kaedah khusus untuk kelas rakaman.
  • Dalam Record , menentukan pembolehubah contoh sebagai ahli kelas tidak dibenarkan kerana ia hanya boleh ditentukan sebagai parameter pembina. Walau bagaimanapun, rekod menyokong medan statik dan kaedah statik, yang boleh digunakan untuk menyimpan dan mengakses data biasa kepada semua kejadian kelas rekod.

Bolehkah rekod melaksanakan antara muka?

Ya, menulis dalam Java boleh melaksanakan antara muka. Sebagai contoh, kod di bawah menunjukkan konsep:
public interface Printable {
   void print();
}
public record Person(String name, int age) implements Printable {
   public void print() {
      System.out.println("Name: " + name + ", Age: " + age);
   }
}
Di sini kami telah menentukan antara muka boleh cetak dengan kaedah print() tunggal . Kami juga menentukan entri Orang yang melaksanakan antara muka Boleh Cetak . Rekod Orang mempunyai dua medan: nama dan umur , dan mengatasi kaedah cetakan antara muka boleh cetak untuk mencetak nilai medan ini. Kami boleh membuat instantiate entri Orang dan memanggil kaedah cetakannya seperti ini:
Person person = new Person("John", 30);
person.print();
Ini akan mengeluarkan Nama: John, Umur: 30 ke konsol . Seperti yang ditunjukkan dalam contoh, rekod Java boleh melaksanakan antara muka sama seperti kelas biasa. Ini boleh berguna untuk menambah gelagat pada entri atau untuk memastikan bahawa entri mematuhi kontrak yang ditakrifkan oleh antara muka.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION