JavaRush /Blog Jawa /Random-JV /Ngopi #230. Apa Records ing Jawa lan carane iku bisa?

Ngopi #230. Apa Records ing Jawa lan carane iku bisa?

Diterbitake ing grup
Sumber: JavaTechOnline Artikel iki menehi tampilan sing luwih jero babagan konsep Rekam ing Jawa kanthi conto, kalebu sintaks, cara nggawe, lan cara nggunakake. Ngopi #230.  Apa Records ing Jawa lan cara kerjane - 1Rekaman ing Jawa minangka salah sawijining fitur gedhe sing pisanan dikenalake ing Jawa 14 minangka fitur pratinjau lan pungkasane metu ing rilis Java 17. Akeh pangembang sing aktif nggunakake, sing mbantu dheweke bisa nyuda kode boilerplate kanthi sukses. Menapa malih, thanks kanggo cathetan, sampeyan ora kudu nulis baris siji kode kanggo nggawe kelas immutable.

Nalika nggunakake Rekam ing Jawa?

Yen sampeyan pengin ngirim data sing ora bisa diganti ing antarane lapisan aplikasi sing beda-beda, mula nggunakake Rekam bisa dadi pilihan sing apik. Kanthi gawan, Rekaman ing Jawa ora bisa diganti, tegese kita ora bisa ngganti sifate yen wis digawe. Akibaté, iki mbantu kita ngindhari kesalahan lan nambah linuwih kode kasebut. Cukup, nggunakake Rekam ing Jawa, kita bisa kanthi otomatis ngasilake kelas.

Ngendi aku bisa nggunakake Rekam ing Jawa?

Umumé, kita bisa nggunakake cathetan ing kahanan apa wae sing kudu ngumumake wadhah data sing prasaja kanthi sifat sing ora bisa diganti lan cara sing digawe kanthi otomatis. Contone, ing ngisor iki sawetara kasus panggunaan sing cathetan bisa migunani: Obyek transfer data (DTO): Kita bisa nggunakake Rekam kanggo ngumumake obyek transfer data prasaja sing ngemot data. Iki migunani nalika nransfer data ing antarane lapisan aplikasi sing beda, kayata ing antarane lapisan layanan lan lapisan basis data. Obyek Konfigurasi : Rekam bisa digunakake kanggo ngumumake obyek konfigurasi sing ngemot sakumpulan sifat konfigurasi kanggo aplikasi utawa modul. Obyek iki biasane duwe sifat sing ora bisa diganti, dadi aman kanggo benang lan gampang digunakake. Nilai obyek. Rekam bisa digunakake kanggo ngumumake obyek nilai sing ngemot sakumpulan nilai sing makili konsep utawa model domain tartamtu. Tanggapan API : Nalika nggawe REST API, data biasane bali ing wangun JSON utawa XML. Ing kasus kaya mengkono, sampeyan bisa uga kudu nemtokake struktur data prasaja sing makili respon API. Rekaman becik kanggo iki amarga ngidini sampeyan nemtokake struktur data sing entheng lan ora bisa diganti sing bisa gampang disambungake menyang JSON utawa XML. Data tes. Nalika nulis tes unit, sampeyan kerep kudu nggawe data tes sing nggambarake skenario tartamtu. Ing kasus kaya mengkono, sampeyan bisa uga kudu nemtokake struktur data prasaja sing makili data test. Rekaman bisa dadi becik kanggo iki amarga ngidini kita nemtokake struktur data sing entheng lan ora bisa diganti kanthi kode boilerplate minimal. Obyek kaya Tuple : Rekaman bisa digunakake kanggo ngumumake obyek kaya Tuple sing ngemot angka sing digandhengake. Iki bisa migunani nalika ngasilake pirang-pirang nilai saka metode utawa nalika nggarap koleksi nilai sing gegandhengan.

Apa Rekor ing Basa Jawa?

Rekam ing Jawa minangka kelas sing dirancang kanggo nyimpen data. Iku padha karo kelas Jawa tradisional, nanging luwih entheng lan duwe sawetara fitur unik. Cathetan ora bisa diganti kanthi gawan, tegese statuse ora bisa diganti sawise digawe. Iki ndadekake dheweke cocog kanggo nyimpen data sing ora bisa diganti, kayata paramèter konfigurasi utawa nilai sing bali saka query database. Iki uga minangka cara kanggo nggawe jinis data khusus sing kalebu sakumpulan kolom utawa variabel, uga cara kanggo ngakses lan ngowahi kolom kasebut. Rekam ing Jawa nggampangake nggarap data kanthi nyuda jumlah kode boilerplate sing kudu ditulis maneh dening pangembang. Sintaks kanggo nggawe entri ing Jawa yaiku:
record Record_Name(Fields....)

Kepiye carane nggawe lan nggunakake Rekam ing Jawa kanthi conto?

Ayo ndeleng carane nggawe lan nggunakake rekaman ing Jawa kanthi program.

Nggawe Rekaman

Nggawe rekaman kanthi program ora meh padha karo nggawe kelas reguler ing Jawa. Tinimbang kelas kita nggunakake tembung kunci rekaman . Sampeyan uga kudu ngumumake kolom kanthi jinis data ing kurung jeneng rekaman. Iki conto kode sing nuduhake carane nggawe entri ing Jawa:
public record Book(String name, double price) { }
Ing conto iki, kita nggawe rekaman sing disebut Buku kanthi rong kolom: jeneng lan rega . Tembung kunci umum nuduhake yen entri iki bisa diakses ing njaba paket sing ditetepake.

Nggunakake Rekam

Kanggo nggunakake rekaman ing Jawa, kita bisa instantiate nggunakake tembung kunci anyar, kaya sing kita tindakake karo kelas biasa. Iki contone:
Book book = new Book( "Core Java" , 324.25);
Ing kene, conto rekaman Buku anyar digawe kanthi kolom jeneng disetel menyang Jawa Inti lan lapangan rega disetel dadi 324.25 . Sawise rekaman digawe, kolom kasebut bisa diakses kanthi nggunakake jeneng lapangan kasebut. Ora ana cara entuk utawa nyetel. Nanging, jeneng lapangan dadi jeneng metode.
String name = book.name();

double price = book.price();
Ing kene kita ndeleng regane kolom jeneng lan rega sing dijupuk saka cathetan Buku . Saliyane kolom, cathetan uga duwe sawetara cara sing bisa digunakake kanggo ngapusi. Contone, toString () , padha karo () lan hashCode () . Elinga yen cathetan Jawa ora bisa diganti kanthi standar, tegese yen wis digawe, negara kasebut ora bisa diganti. Ayo goleki conto liyane babagan carane nggawe lan nggunakake cathetan ing Jawa. Ayo njupuk kasus sing mbutuhake rekaman kanggo nyimpen informasi babagan siswa.
public record Student(String name, int age, String subject) {}
Iki nggawe rekaman sing diarani Siswa kanthi telung kolom: jeneng , umur lan subyek . Kita bisa nggawe conto entri iki kaya ing ngisor iki:
Student student = new Student("John Smith", 20, "Computer Science");
Banjur kita bisa entuk nilai lapangan nggunakake jeneng lapangan:
String name = student.name();
int age = student.age();
String subject= student.subject();

Apa Rekam katon sawise kompilasi?

Wiwit Rekam mung jinis khusus saka kelas, compiler uga ngowahi menyang kelas biasa, nanging karo sawetara Watesan lan beda. Nalika compiler ngowahi rekaman (Java file) menyang bytecode sawise proses kompilasi, kui file .class ngemot sawetara deklarasi tambahan saka kelas Rekam . Contone, ing ngisor iki minangka bytecode sing digawe kanggo entri Siswa dening compiler Java:
record Student(String name, int age) {   }

Nulis menyang file .class (sawise kompilasi)

Kita uga bisa nemokake kelas sing diowahi ing ngisor iki yen nggunakake alat javap lan ngetrapake perintah ing ngisor iki saka baris perintah. Wigati dimangerteni manawa baris perintah Java kalebu alat javap , sing bisa digunakake kanggo ndeleng informasi babagan kolom, konstruktor, lan metode file kelas. > javap Kesimpulan Siswa: Yen kita mriksa bytecode kasebut kanthi teliti, kita bisa uga duwe sawetara pengamatan:
  • Compiler ngganti tembung kunci Rekam karo kelas .
  • Penyusun ngumumake final kelas . Iki nuduhake yen kelas iki ora bisa ditambahi. Iki uga ateges ora bisa diwarisake lan sifate ora owah.
  • Kelas sing diowahi ngluwihi java.lang.Record . Iki nuduhake yen kabeh cathetan minangka subclass saka kelas Rekam sing ditetepake ing paket java.lang .
  • Compiler nambahake konstruktor parameter.
  • Compiler kanthi otomatis nggawe toString () , hashCode () lan padha () cara .
  • Compiler wis nambahake cara kanggo ngakses lapangan. Pay manungsa waé kanggo konvènsi jeneng cara - padha persis padha karo jeneng lapangan, ana ngirim ora njaluk utawa nyetel sadurunge jeneng lapangan .

Fields ing Records

Cathetan ing Jawa nemtokake statuse nggunakake sakumpulan kolom, saben jeneng lan jinise beda. Bidang rekaman diumumake ing header rekaman. Tuladhane:
public record Person(String name, int age) {}
Entri iki nduweni rong kolom: jeneng jinis String lan umur jinis int . Bidang rekaman pancen final lan ora bisa ditugasake maneh sawise rekaman digawe. Kita bisa nambah lapangan anyar, nanging iki ora dianjurake. Bidang anyar sing ditambahake menyang rekaman kudu statis. Tuladhane:
public record Person(String name, int age) {

   static String sex;
}

Konstruktor ing Records

Kaya konstruktor kelas tradisional, konstruktor rekaman digunakake kanggo nggawe rekaman. Rekaman nduweni rong konsep konstruktor: konstruktor kanonik lan konstruktor kompak . Konstruktor kompak menehi cara sing luwih ringkes kanggo miwiti variabel negara ing rekaman, dene konstruktor kanonik nyedhiyakake cara sing luwih tradisional kanthi luwih fleksibel.

Konstruktor kanonik

Compiler Java standar nyedhiyakake konstruktor kabeh-argumen (konstruktor kabeh-lapangan) sing nemtokake argumen kasebut menyang kolom sing cocog. Iki dikenal minangka konstruktor kanonik. Kita uga bisa nambah logika bisnis kayata statement kondisional kanggo validasi data. Ing ngisor iki contone:
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");
           }
      }
}

Desainer kompak

Konstruktor kompak nglirwakake kabeh argumen, kalebu kurung. Kolom sing cocog ditugasake kanthi otomatis. Contone, kode ing ngisor iki nuduhake konsep konstruktor kompak ing Records :
public record Person(String name, int age) {

      public Person {
          if (age < 18) {
              throw new IllegalArgumentException("You are not allowed to participate in general elections");
          }
     }
}
Saliyane konstruktor kompak, sampeyan bisa nemtokake konstruktor biasa ing Rekam , kaya ing kelas biasa. Nanging, sampeyan kudu nggawe manawa kabeh konstruktor miwiti kabeh lapangan rekaman.

Metode ing Records

Rekaman ing Jawa kanthi otomatis ngasilake sakumpulan cara kanggo saben lapangan ing rekaman. Cara kasebut diarani metode accessor lan duwe jeneng sing padha karo lapangan sing digandhengake. Contone, yen rekaman duwe lapangan sing dijenengi price , banjur kanthi otomatis bakal duwe metode sing diarani rega () sing ngasilake nilai lapangan rega . Saliyane cara accessor sing digawe kanthi otomatis, kita uga bisa nemtokake cara dhewe ing entri, kaya ing kelas biasa. Tuladhane:
public record Person(String name, int age) {
   public void sayHello() {
      System.out.println("Hello, my name is " + name);
   }
}
Entri iki nduweni metode sayHello () sing nyithak salam nggunakake kolom jeneng .

Carane Rekam mbantu nyuda kode boilerplate

Ayo goleki conto sing gampang kanggo ndeleng kepiye notasi Jawa bisa mbantu ngilangi kode boilerplate. Contone, kita duwe kelas sing diarani Person sing makili wong kanthi jeneng, umur lan alamat email. Iki carane kita nemtokake kelas kanthi cara tradisional. Kode tanpa nggunakake Rekam :
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 + '\'' +
      '}';
    }
}
Minangka kita bisa ndeleng, kelas iki mbutuhake akeh kode boilerplate kanggo nemtokake lapangan, konstruktor, getter, setters, lan toString () cara . Kajaba iku, umpamane kita pengin nggawe kelas iki ora bisa diganti. Kanggo nindakake iki, kita kudu nindakake sawetara langkah tambahan kayata:
  • Nyatakake kelas minangka final supaya ora bisa ditambah.
  • Nyatakake kabeh lapangan pribadi lan final supaya ora bisa diganti ing njaba konstruktor.
  • Aja nyedhiyakake metode setter kanggo kolom.
  • Yen salah sawijining kolom sing bisa diganti, sampeyan kudu ngasilake salinan kasebut tinimbang mbalekake obyek asli.
Kode nggunakake Rekam :
public record Person(String name, int age, String email) {}
Iku kabeh! Kanthi mung siji baris kode, kita wis ditetepake kelas sing nduweni lapangan padha, konstruktor, getter, setters, lan toString () cara minangka kelas tradisional. Sintaks Rekam ngurus kabeh kode boilerplate kanggo kita. Saka conto ing ndhuwur, cetha yen nggunakake rekaman ing Jawa bisa mbantu ngilangi kode boilerplate kanthi nyediakake sintaksis sing luwih ringkes kanggo nemtokake kelas kanthi set lapangan sing tetep. Kurang kode sing dibutuhake kanggo nemtokake lan nggunakake rekaman tinimbang pendekatan tradisional, lan cathetan nyedhiyakake akses langsung menyang lapangan kanthi nggunakake cara kanggo nganyari lapangan. Iki nggawe kode luwih bisa diwaca, dijaga, lan kurang rawan kesalahan. Kajaba iku, kanthi sintaks Rekam , kita ora perlu nindakake apa-apa kanggo nggawe kelas ora bisa diganti. Kanthi gawan, kabeh kolom ing rekaman final lan kelas rekaman dhewe ora bisa diganti. Mulane, nggawe kelas immutable nggunakake sintaks nulis luwih prasaja lan mbutuhake kode kurang saka pendekatan tradisional. Kanthi cathetan, kita ora perlu ngumumake lapangan minangka final , nyedhiyakake konstruktor sing miwiti lapangan, utawa nyedhiyakake getter kanggo kabeh lapangan.

Kelas Rekam Umum

Jawa uga bisa nemtokake kelas Records umum . Kelas entri umum yaiku kelas entri sing nduweni siji utawa luwih parameter jinis. Punika conto:
public record Pair<T, U>(T first, U second) {}
Ing conto iki , Pair minangka kelas rekaman umum sing njupuk rong paramèter jinis T lan U. Kita bisa nggawe conto rekaman iki kaya ing ngisor iki:
Pair<String, Integer>pair = new Pair<>( "Hello" , 123);

Nested kelas nang Rekam

Sampeyan uga bisa nemtokake kelas nested lan antarmuka ing entri. Iki migunani kanggo ngelompokake kelas lan antarmuka sing gegandhengan, lan bisa mbantu nambah organisasi lan njaga basis kode sampeyan. Iki minangka conto entri sing ngemot kelas nested:
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;
       }
    }
}
Ing conto iki, Person minangka entri sing ngemot kelas Kontak bersarang . Sabanjure, Kontak minangka kelas bersarang statis sing ngemot rong kolom pungkasan pribadi: alamat email lan telpon. Uga nduweni konstruktor sing nampa email lan nomer telpon, lan loro cara getter: getEmail () lan getPhone () . Kita bisa nggawe conto Wong kaya iki:
Person person = new Person("John",30, new Person.Contact("john@example.com", "123-456-7890"));
Ing conto iki, kita nggawe obyek Person anyar jenenge John , umur 30, lan obyek Kontak anyar karo email john@example.com lan telpon 123-456-7890 .

Antarmuka nested nang Rekam

Ing ngisor iki conto entri sing ngemot antarmuka nested:
public record Book(String title, String author, Edition edition){
    public interface Edition{
       String getName();
   }
}
Ing conto iki, Buku minangka entri sing ngemot antarmuka Edisi bersarang . Sabanjure, Edition minangka antarmuka sing nemtokake cara getName() siji . Kita bisa nggawe conto Buku kaya ing ngisor iki:
Book book = new Book("The Hitchhiker's Guide to the Galaxy", "Douglas Adams", new Book.Edition() {

   public String getName() {

      return "Science Fiction";
   }
});
Ing conto iki, kita nggawe obyek Book anyar kanthi judhul The Hitchhiker's Guide to the Galaxy dening Douglas Adams lan implementasine anonim anyar saka antarmuka Edition sing ngasilake jeneng Fiksi Ilmu nalika metode getName () diarani .

Apa maneh sing bisa ditindakake Records?

  • Entri bisa nemtokake konstruktor khusus. Rekaman ndhukung konstruktor parameter, sing bisa nelpon konstruktor standar kanthi paramèter sing kasedhiya ing awak. Kajaba iku, cathetan uga ndhukung konstruktor kompak, sing padha karo konstruktor standar nanging bisa kalebu fungsi tambahan kayata mriksa ing awak konstruktor.
  • Kaya kelas liyane ing Jawa, Rekam bisa nemtokake lan nggunakake cara conto. Iki tegese kita bisa nggawe lan nelpon cara khusus kanggo kelas rekaman.
  • Ing Rekam , nemtokake variabel conto minangka anggota kelas ora diidini amarga mung bisa ditemtokake minangka paramèter konstruktor. Nanging, cathetan ndhukung kolom statis lan cara statis, sing bisa digunakake kanggo nyimpen lan ngakses data sing umum kanggo kabeh kedadeyan kelas rekaman.

Apa rekaman bisa ngetrapake antarmuka?

Ya, nulis ing Jawa bisa ngetrapake antarmuka. Contone, kode ing ngisor iki nuduhake 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);
   }
}
Kene kita wis ditetepake antarmuka Printable karo print siji () cara . Kita uga nemtokake entri Wong sing ngetrapake antarmuka sing bisa dicithak . Rekaman Person nduweni rong kolom: jeneng lan umur , lan ngganti cara cetak antarmuka sing bisa dicithak kanggo nyithak nilai kolom kasebut. Kita bisa instantiate entri Person lan nelpon cara print kaya iki:
Person person = new Person("John", 30);
person.print();
Iki bakal output Jeneng: John, Umur: 30 kanggo console . Kaya sing dituduhake ing conto, cathetan Java bisa ngetrapake antarmuka kaya kelas biasa. Iki bisa migunani kanggo nambah prilaku menyang entri utawa kanggo mesthekake yen entri salaras karo kontrak sing ditetepake dening antarmuka.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION