Ključna riječ Java 14 Record

1. Uvod

Prosljeđivanje nepromjenjivih podataka između objekata jedan je od najčešćih, ali svakodnevnih zadataka u mnogim Java programima.

Prije Jave 14, to je zahtijevalo stvaranje klase s uzorcima polja i metoda, koje su bile osjetljive na trivijalne pogreške i zbrkane namjere.

Izlaskom Jave 14, sada možemo koristiti zapise kako bismo riješili ove probleme.

U ovom vodiču, osvrnut ćemo se na osnove zapisa, uključujući njihovu svrhu,generirane metode i tehnike prilagodbe.

2. Svrha

Uobičajeno je da klase pišemo kako bismo jednostavno držali podatke, poput rezultata baze podataka, rezultata upita ili informacija iz usluge.

U mnogim su slučajevima ovi podaci nepromjenjivi, budući da nepromjenjivost osigurava valjanost podataka bez sinkronizacije.

Da bismo to postigli, stvaramo klase podataka sa sljedećim:

  1. privatni, konačni polje za svaki podatak
  2. getter za svako polje
  3. javnost konstruktor s odgovarajućim argumentom za svako polje
  4. jednako metoda koja se vraća pravi za objekte iste klase kada se sva polja podudaraju
  5. hashCode metoda koja vraća istu vrijednost kada se sva polja podudaraju
  6. toString metoda koja uključuje naziv klase i ime svakog polja i odgovarajuću vrijednost

Na primjer, možemo stvoriti jednostavan Osoba podatkovna klasa, s imenom i adresom:

javni razred Osoba {privatni konačni naziv niza; privatna konačna adresa niza; javna osoba (ime niza, adresa niza) {this.name = name; this.address = adresa; } @Override public int hashCode () {return Objects.hash (ime, adresa); } @Override public boolean equals (Object obj) {if (this == obj) {return true; } else if (! (obj instance of Person)) {return false; } else {Osoba ostalo = (Osoba) obj; vratiti Objects.equals (ime, drugo.ime) && Objects.equals (adresa, druga.adresa); }} @Override public String toString () {return "Osoba [ime =" + ime + ", adresa =" + adresa + "]"; } // standardni dohvatnici}

Iako ovo ostvaruje naš cilj, s njim postoje dva problema:

  1. Puno je šifara
  2. Nejasne su nam svrhe našeg predavanja - predstavljati osobu s imenom i adresom

U prvom slučaju, moramo ponoviti isti zamorni postupak za svaku klasu podataka, monotono stvarajući novo polje za svaki dio podataka, stvarajući jednako, hashCode, i toString metode i stvaranje konstruktora koji prihvaća svako polje.

Iako IDE-ovi mogu automatski generirati mnoge od ovih klasa, ne uspijevaju automatski ažurirati naše predmete kada dodamo novo polje. Na primjer, ako dodamo novo polje, moramo ažurirati svoje jednako metoda za uključivanje ovog polja.

U drugom slučaju, dodatni kod zaklanja da je naša klasa jednostavno podatkovna klasa to ima dva Niz polja: Ime i adresa.

Bolji pristup bio bi izričito proglasiti da je naša klasa podatkovna klasa.

3. Osnove

Od JDK 14 možemo ponavljajuće klase podataka zamijeniti zapisima. Zapisi su nepromjenjive klase podataka koje zahtijevaju samo vrstu i ime polja.

The jednako, hashCode, i toString metode, kao i privatni, konačni polja i javnost konstruktor, generira ih Java prevodilac.

Za stvaranje a Osoba zapis, koristimo snimiti ključna riječ:

javni zapis Osoba (ime niza, adresa niza) {}

3.1. Konstruktor

Koristeći zapise, za nas se generira javni konstruktor - s argumentom za svako polje.

U slučaju našeg Osoba zapis, ekvivalentni konstruktor je:

javna osoba (ime niza, adresa niza) {this.name = name; this.address = adresa; }

Ovaj se konstruktor može koristiti na isti način kao klasa za instanciranje objekata iz zapisa:

Osoba osoba = nova osoba ("John Doe", "100 Linda Ln.");

3.2. Dobivači

Također besplatno dobivamo metode javnih dobivača - čija se imena podudaraju s nazivom našeg polja.

U našem Osoba zapis, to znači a Ime() i adresa() getter:

@Test javna praznina givenValidNameAndAddress_whenGetNameAndAddress_thenExpectedValuesReturned () {String name = "John Doe"; Adresa niza = "100 Linda Ln."; Osoba osoba = nova Osoba (ime, adresa); assertEquals (ime, osoba.ime ()); assertEquals (adresa, osoba.adresa ()); }

3.3. jednako

Uz to, an jednako metoda se generira za nas.

Ova metoda se vraća pravi ako je isporučeni objekt istog tipa i vrijednosti svih njegovih polja se podudaraju:

@Test javna praznina givenSameNameAndAddress_whenEquals_thenPersonsEqual () {String name = "John Doe"; Adresa niza = "100 Linda Ln."; Osoba person1 = nova Osoba (ime, adresa); Osoba person2 = nova Osoba (ime, adresa); assertTrue (person1.equals (person2)); }

Ako se neko od polja razlikuje između dva Osoba instancama, jednako metoda će se vratiti lažno.

3.4. hashCode

Slično našem jednako metoda, odgovarajuća hashCode metoda je također generirana za nas.

Naše hashCode metoda vraća istu vrijednost za dvoje Osoba objekata ako se podudaraju sve vrijednosti polja za oba objekta (zabrana sudara zbog rođendanskog paradoksa):

@Test javna praznina givenSameNameAndAddress_whenHashCode_thenPersonsEqual () {String name = "John Doe"; Adresa niza = "100 Linda Ln."; Osoba person1 = nova Osoba (ime, adresa); Osoba person2 = nova Osoba (ime, adresa); assertEquals (person1.hashCode (), person2.hashCode ()); } 

The hashCode vrijednost će se razlikovati ako se bilo koja od vrijednosti polja razlikuje.

3.5. toString

Na kraju, također dobivamo atoString metoda koja rezultira nizom koji sadrži ime zapisa, nakon čega slijedi naziv svakog polja i njegova odgovarajuća vrijednost u uglastim zagradama.

Stoga, instanciranje a Osoba s imenom "John Doe" i adresu “100 Linda Ln.”Rezultira sljedećim toString proizlaziti:

Osoba [ime = John Doe, adresa = 100 Linda Ln.]

4. Konstruktori

Iako se za nas generira javni konstruktor, i dalje možemo prilagoditi našu implementaciju konstruktora.

Ova prilagodba namijenjena je korištenju za provjeru valjanosti i trebala bi biti što jednostavnija.

Na primjer, možemo osigurati da Ime i adresa pod uvjetom da naša Osoba zapis nisu null koristeći sljedeću izvedbu konstruktora:

javni zapis Osoba (ime niza, adresa niza) {javna osoba {Objects.requireNonNull (ime); Objects.requireNonNull (adresa); }}

Također možemo stvoriti nove konstruktore s različitim argumentima davanjem drugog popisa argumenata:

javni zapis Osoba (ime niza, adresa niza) {javna osoba (ime niza) {this (ime, "Nepoznato"); }}

Kao i kod konstruktora klasa, na polja se može referencirati pomoću ovaj ključna riječ (na primjer, ovo.ime i ovo.adresu) i argumenti se podudaraju s nazivom polja (to je, Ime i adresa).

Imajte na umu da stvaranje konstruktora s istim argumentima kao i generirani javni konstruktor je valjano, ali to zahtijeva da se svako polje ručno inicijalizira:

javni zapis Osoba (ime niza, adresa niza) {javna osoba (ime niza, adresa niza) {this.name = ime; this.address = adresa; }}

Dodatno, deklariranje konstruktora bez argumenta i onog s popisom argumenata koji odgovara generiranom konstruktoru rezultira pogreškom kompilacije.

Stoga se slijedeće neće sastaviti:

javni zapis Osoba (ime niza, adresa niza) {javna osoba {Objects.requireNonNull (ime); Objects.requireNonNull (adresa); } javna osoba (ime niza, adresa niza) {this.name = name; this.address = adresa; }}

5. Statičke varijable i metode

Kao i kod redovnih Java satova, u svoje zapise možemo uključiti i statičke varijable i metode.

Statičke varijable deklariramo koristeći istu sintaksu kao klasa:

javni zapis Osoba (naziv niza, adresa niza) {public static String UNKNOWN_ADDRESS = "Nepoznato"; }

Isto tako, deklariramo statičke metode koristeći istu sintaksu kao klasa:

javni zapis Osoba (naziv niza, adresa niza) {javna statična osoba neimenovana (adresa niza) {return new Person ("Neimenovana", adresa); }}

Tada se možemo pozivati ​​i na statičke varijable i na statičke metode koristeći ime zapisa:

Osoba.UNKNOWN_ADDRESS Osoba.neimenovana ("100 Linda Ln.");

6. Zaključak

U ovom smo članku pogledali snimiti ključna riječ uvedena u Javi 14, uključujući njihove temeljne koncepte i zamršenost.

Upotrebom zapisa - njihovim metodama koje generira kompajler - možemo smanjiti šifru i poboljšati pouzdanost naših nepromjenjivih klasa.

Kôd i primjeri ovog vodiča mogu se naći na GitHubu.