Java 14 Kľúčové slovo záznamu

1. Úvod

Prenos nemenných údajov medzi objektmi je jednou z najbežnejších, ale všedných úloh v mnohých aplikáciách Java.

Pred jazykom Java 14 si to vyžadovalo vytvorenie triedy s typovými poľami a metódami, ktoré boli náchylné na triviálne chyby a zmätené zámery.

S vydaním Java 14 môžeme teraz na odstránenie týchto problémov používať záznamy.

V tomto návode pozrieme sa na základy záznamov, vrátane ich účelu,generované metódy a techniky prispôsobenia.

2. Účel

Bežne píšeme triedy na jednoduché uchovávanie údajov, ako sú napríklad výsledky databázy, výsledky dotazov alebo informácie zo služby.

V mnohých prípadoch sú tieto údaje nemenné nemennosť zaisťuje platnosť údajov bez synchronizácie.

Aby sme to dosiahli, vytvárame dátové triedy s nasledujúcimi:

  1. súkromné, konečné pole pre každý údaj
  2. kariérista pre každé pole
  3. verejné konštruktor so zodpovedajúcim argumentom pre každé pole
  4. rovná sa metóda, ktorá sa vráti pravda pre objekty rovnakej triedy, keď sa všetky polia zhodujú
  5. hashCode metóda, ktorá vráti rovnakú hodnotu, keď sa všetky polia zhodujú
  6. natiahnuť metóda, ktorá obsahuje názov triedy a názov každého poľa a jeho zodpovedajúcu hodnotu

Môžeme napríklad vytvoriť jednoduchý Osoba dátová trieda, s menom a adresou:

public class Osoba {private final Názov reťazca; súkromná konečná adresa reťazca; verejná osoba (meno reťazca, adresa reťazca) {this.name = meno; this.address = adresa; } @Override public int hashCode () {return Objects.hash (meno, adresa); } @Override public boolean equals (Object obj) {if (this == obj) {return true; } else if (! (obj instanceof Person)) {return false; } else {Osoba other = (Osoba) obj; vrátiť Objects.equals (meno, ďalšie.názov) && Objects.equals (adresa, iná.adresa); }} @Override public String toString () {return "Person [name =" + name + ", address =" + address + "]"; } // štandardné vyhľadávače}

Týmto sa síce dosahuje náš cieľ, ale existujú dva problémy:

  1. Existuje veľa štandardných kódov
  2. Zastierame účel našej triedy - zastupovať osobu menom a adresou

V prvom prípade musíme pre každú dátovú triedu opakovať rovnaký zdĺhavý proces, monotónne vytvárať nové pole pre každú časť dát, vytvárať rovná sa, hashCodea natiahnuť metódy a vytvorenie konštruktora, ktorý akceptuje každé pole.

Aj keď IDE môžu automaticky generovať mnoho z týchto tried, nedokážu automaticky aktualizovať naše triedy, keď pridáme nové pole. Napríklad, ak pridáme nové pole, musíme aktualizovať naše rovná sa tejto oblasti.

V druhom prípade extra kód zakrýva, že naša trieda je jednoducho dátová trieda to má dva String polia: názov a adresa.

Lepším prístupom by bolo výslovné prehlásenie, že naša trieda je dátovou triedou.

3. Základy

Od JDK 14 môžeme naše opakujúce sa dátové triedy nahradiť záznamami. Záznamy sú nemenné dátové triedy, ktoré vyžadujú iba typ a názov polí.

The rovná sa, hashCodea natiahnuť metódy, ako aj súkromné, konečné polia a verejné konštruktor, sú generované kompilátorom Java.

Ak chcete vytvoriť Osoba záznam, použijeme záznam kľúčové slovo:

verejný záznam Osoba (meno reťazca, adresa reťazca) {}

3.1. Konštruktér

Pomocou záznamov sa pre nás generuje verejný konštruktor - s argumentom pre každé pole.

V prípade nášho Osoba záznamu, ekvivalentný konštruktor je:

verejná osoba (meno reťazca, adresa reťazca) {this.name = meno; this.address = adresa; }

Tento konštruktor možno použiť na vytvorenie inštancie objektov zo záznamu rovnakým spôsobom ako trieda:

Osoba osoba = nová osoba („John Doe“, „100 Linda Ln.“);

3.2. Getters

Zadarmo tiež dostávame metódy verejného getra - ktorých mená sa zhodujú s názvom nášho poľa.

V našom Osoba záznam, to znamená a názov() a adresa () getter:

@Test public void givenValidNameAndAddress_whenGetNameAndAddress_thenExectedValuesReturned () {Názov reťazca = "John Doe"; Adresa reťazca = "100 Linda Ln."; Osoba osoba = nová Osoba (meno, adresa); assertEquals (meno, osoba.name ()); assertEquals (adresa, osoba.adresa ()); }

3.3. rovná sa

Dodatočne, rovná sa metóda je generovaná pre nás.

Táto metóda sa vráti pravda ak je dodaný objekt rovnakého typu a hodnoty všetkých jeho polí sa zhodujú:

@Test public void givenSameNameAndAddress_whenEquals_thenPersonsEqual () {Názov reťazca = "John Doe"; Adresa reťazca = "100 Linda Ln."; Osoba person1 = nová Osoba (meno, adresa); Osoba person2 = nová Osoba (meno, adresa); assertTrue (person1.equals (person2)); }

Ak sa niektoré z polí líši medzi dvoma Osoba inštancie, rovná sa metóda sa vráti nepravdivé.

3.4. hashCode

Podobne ako u nás rovná sa metóda, zodpovedajúca hashCode metóda sa generuje aj pre nás.

Náš hashCode metóda vráti rovnakú hodnotu pre dvoch Osoba objekty, ak sa zhodujú všetky hodnoty polí pre oba objekty (blokovanie kolízií v dôsledku narodeninového paradoxu):

@Test public void givenSameNameAndAddress_whenHashCode_thenPersonsEqual () {Názov reťazca = "John Doe"; Adresa reťazca = "100 Linda Ln."; Osoba person1 = nová Osoba (meno, adresa); Osoba person2 = nová Osoba (meno, adresa); assertEquals (person1.hashCode (), person2.hashCode ()); } 

The hashCode hodnota sa bude líšiť, ak sa niektorá z hodnôt poľa líši.

3.5. natiahnuť

Nakoniec dostávame aj anatiahnuť metóda, ktorej výsledkom je reťazec obsahujúci názov záznamu, za ktorým nasleduje názov každého poľa a jeho zodpovedajúca hodnota v hranatých zátvorkách.

Preto inštancia a Osoba s menom "John Doe" a adresa „100 Linda Ln.”Má za následok nasledovné natiahnuť výsledok:

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

4. Konštruktéri

Aj keď je pre nás generovaný verejný konštruktor, môžeme ešte prispôsobiť našu implementáciu konštruktora.

Toto prispôsobenie je určené na použitie pri overovaní a malo by byť čo najjednoduchšie.

Môžeme napríklad zabezpečiť, aby: názov a adresa poskytované našim Osoba záznam nie sú nulový pomocou nasledujúcej implementácie konštruktora:

verejný záznam Osoba (meno reťazca, adresa reťazca) {verejná osoba {Objects.requireNonNull (meno); Objects.requireNonNull (adresa); }}

Môžeme tiež vytvoriť nové konštruktory s rôznymi argumentmi zadaním iného zoznamu argumentov:

verejný záznam Osoba (meno reťazca, adresa reťazca) {verejná osoba (meno reťazca) {toto (meno, "Neznáme"); }}

Rovnako ako u konštruktorov triedy, na polia sa dá odkazovať pomocou toto kľúčové slovo (napríklad, toto.názov a táto.adresa) a argumenty sa zhodujú s názvom polí (to znamená, názov a adresa).

Poznač si to vytvorenie konštruktora s rovnakými argumentmi ako vygenerovaný verejný konštruktor je platné, vyžaduje si to však manuálnu inicializáciu každého poľa:

verejný záznam Osoba (meno reťazca, adresa reťazca) {verejná osoba (meno reťazca, adresa reťazca) {this.name = meno; this.address = adresa; }}

Navyše, deklarovanie konštruktora bez argumentov a jedného so zoznamom argumentov, ktorý sa zhoduje s vygenerovaným konštruktorom, má za následok chybu kompilácie.

Preto sa nebude kompilovať:

verejný záznam Osoba (meno reťazca, adresa reťazca) {verejná osoba {Objects.requireNonNull (meno); Objects.requireNonNull (adresa); } verejná osoba (meno reťazca, adresa reťazca) {this.name = meno; this.address = adresa; }}

5. Statické premenné a metódy

Rovnako ako v bežných triedach Java, do našich záznamov môžeme zahrnúť aj statické premenné a metódy.

Statické premenné deklarujeme pomocou rovnakej syntaxe ako trieda:

verejný záznam Osoba (meno reťazca, adresa reťazca) {public static String UNKNOWN_ADDRESS = "Neznáme"; }

Rovnako deklarujeme statické metódy s rovnakou syntaxou ako trieda:

public record Person (String name, String address) {public static Person unnamed (String address) {return new Person ("Unnamed", address); }}

Potom môžeme odkazovať na statické premenné aj na statické metódy pomocou názvu záznamu:

Person.UNKNOWN_ADDRESS Person.unnamed ("100 Linda Ln.");

6. Záver

V tomto článku sme sa pozreli na záznam kľúčové slovo zavedené v Jave 14, vrátane ich základných konceptov a zložitostí.

Pomocou záznamov - pomocou ich metód generovaných kompilátorom - môžeme znížiť štandardný kód a zvýšiť spoľahlivosť našich nemenných tried.

Kód a príklady tohto tutoriálu nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found