Java 14 Record kulcsszó

1. Bemutatkozás

Az objektumok között megváltoztathatatlan adatok továbbítása az egyik leggyakoribb, de mindennapi feladat sok Java alkalmazásban.

A Java 14 előtt ehhez egy olyan osztály létrehozására volt szükség, amely kazánmezőket és módszereket tartalmaz, amelyek hajlamosak a triviális hibákra és a zavaros szándékokra.

A Java 14 kiadásával most rekordokat használhatunk e problémák orvoslására.

Ebben az oktatóanyagban megnézzük a rekordok alapjait, beleértve azok célját,generált módszerek és testreszabási technikák.

2. Cél

Általában olyan osztályokat írunk, amelyek egyszerűen tárolják az adatokat, például az adatbázis eredményeit, a lekérdezési eredményeket vagy a szolgáltatásból származó információkat.

Sok esetben ezek az adatok megváltoztathatatlanok, mivel a megváltoztathatatlanság szinkronizálás nélkül biztosítja az adatok érvényességét.

Ennek megvalósításához adatosztályokat hozunk létre a következőkkel:

  1. magán, végső mező az egyes adatokhoz
  2. getter az egyes mezőkhöz
  3. nyilvános konstruktor, az egyes mezőkhöz megfelelő argumentummal
  4. egyenlő visszatérő módszer igaz azonos osztályú objektumokhoz, amikor minden mező egyezik
  5. hash kód metódus, amely ugyanazt az értéket adja vissza, amikor az összes mező egyezik
  6. Sztring módszer, amely tartalmazza az osztály nevét és az egyes mezők nevét és a hozzájuk tartozó értéket

Például létrehozhatunk egy egyszerűt Személy adatosztály, névvel és címmel:

public class Személy {private final Sztring név; privát végső String cím; public Person (karakterlánc neve, karakterlánc címe) {this.name = név; this.cím = cím; } @Orride public int hashCode () {return Objects.hash (név, cím); } @Orride public boolean egyenlő (Object obj) {if (this == obj) {return true; } else if (! (Személy objektuma)) {return false; } else {Személy más = (Személy) obj; return Objects.equals (név, egyéb.név) && Objects.equals (cím, egyéb.cím); }} @Orride public String toString () {return "Személy [név =" + név + ", cím =" + cím + "]"; } // standard getters}

Bár ez megvalósítja célunkat, két probléma van vele:

  1. Nagyon sok kazán kód van
  2. Elfedjük az osztályunk célját - egy személy nevével és címével való képviseletét

Az első esetben ugyanazt az unalmas folyamatot kell megismételnünk minden egyes adatosztály esetében, monoton módon létrehozva egy új mezőt az egyes adatokhoz, egyenlő, hash kód, és Sztring módszereket, és létrehoz egy konstruktort, amely elfogadja az egyes mezőket.

Míg az IDE-k automatikusan létrehozhatnak sok ilyen osztályt, nem tudják automatikusan frissíteni az osztályainkat, amikor új mezőt adunk hozzá. Például, ha új mezőt adunk hozzá, akkor frissítenünk kell a egyenlő módszer a mező beépítésére.

A második esetben az extra kód elfedi, hogy az osztályunk egyszerűen adatosztály hogy kettő van Húr mezők: név és cím.

Jobb megközelítés lenne kifejezetten kijelenteni, hogy osztályunk adatosztály.

3. Az alapok

A JDK 14-től az ismétlődő adatosztályokat rekordokkal helyettesíthetjük. A rekordok változhatatlan adatosztályok, amelyekhez csak a mezők típusa és neve szükséges.

A egyenlő, hash kód, és Sztring módszerek, valamint a magán, végső mezők, és nyilvános konstruktort a Java fordító generálja.

A Személy rekordot használjuk rekord kulcsszó:

nyilvános nyilvántartás Személy (karakterlánc neve, karakterlánc címe) {}

3.1. Konstruktőr

Rekordok felhasználásával egy nyilvános konstruktort hozunk létre - minden mezőhöz hozzáadva egy argumentumot -.

A mi esetünkben Személy rekord, az egyenértékű konstruktor:

public Person (karakterlánc neve, karakterlánc címe) {this.name = név; this.cím = cím; }

Ez a konstruktor ugyanúgy használható, mint egy osztály objektumok példányosítására a rekordból:

Személy személy = új Személy ("John Doe", "100 Linda Ln.");

3.2. Getters

Ingyenes nyilvános getters módszereket is kapunk - amelyek neve megegyezik a szakterületünk nevével - ingyen.

Miénkben Személy rekord, ez azt jelenti, hogy a név() és cím() getter:

@Test public void givenValidNameAndAddress_whenGetNameAndAddress_thenExpectedValuesReturned () {String name = "John Doe"; Karakterlánc-cím = "100 Linda Ln."; Személy személy = új Személy (név, cím); assertEquals (név, személy.név ()); assertEquals (cím, személy.cím ()); }

3.3. egyenlő

Ezenkívül egy egyenlő módszer generálódik számunkra.

Ez a módszer visszatér igaz ha a szállított objektum azonos típusú és az összes mezőjének értéke megegyezik:

@Test public void givenSameNameAndAddress_whenEquals_thenPersonsEqual () {String name = "John Doe"; Karakterlánc-cím = "100 Linda Ln."; Személy személy1 = új Személy (név, cím); Személy személy2 = új Személy (név, cím); assertTrue (személy1.egyenlő (személy2)); }

Ha a mezők bármelyike ​​eltér egymástól Személy esetek, a egyenlő módszer visszatér hamis.

3.4. hash kód

Hasonló a miénkhez egyenlő módszer, ennek megfelelő hash kód módszer is generálódik számunkra.

A mi hash kód metódus ugyanazt az értéket adja vissza kettőre Személy objektumok, ha mindkét objektum mezőértéke megegyezik (ütközések megakadályozása a születésnapi paradoxon miatt):

@Test public void givenSameNameAndAddress_whenHashCode_thenPersonsEqual () {String name = "John Doe"; Karakterlánc-cím = "100 Linda Ln."; Személy személy1 = új Személy (név, cím); Személy személy2 = új Személy (név, cím); assertEquals (person1.hashCode (), person2.hashCode ()); } 

A hash kód érték akkor változik, ha a mezőértékek bármelyike ​​eltér.

3.5. Sztring

Végül kapunk egySztring metódus, amely egy rekordot eredményez, amely tartalmazza a rekord nevét, majd az egyes mezők nevét és a megfelelő értéket szögletes zárójelben.

Ezért példázza a Személy névvel "Gipsz Jakab" címe „100 Linda Ln.”A következőket eredményezi Sztring eredmény:

Személy [név = John Doe, cím = 100 Linda Ln.]

4. Konstruktorok

Míg számunkra generálnak egy nyilvános kivitelezőt, mégis testreszabhatjuk a kivitelező megvalósítását.

Ez a testreszabás érvényesítésre szolgál, és a lehető legegyszerűbbnek kell lennie.

Például biztosíthatjuk, hogy a név és cím biztosított a mi Személy rekord nem nulla a következő konstruktor implementációval:

nyilvános nyilvántartás Személy (karakterlánc neve, karakterlánc címe) {nyilvános személy {Objects.requireNonNull (név); Objects.requireNonNull (cím); }}

Új konstruktorokat is létrehozhatunk különböző argumentumokkal egy másik argumentumlista megadásával:

nyilvános nyilvántartás Személy (karakterlánc neve, karakterlánc címe) {nyilvános személy (karakterlánc neve) {ez (név, "Ismeretlen"); }}

Mint az osztályépítőknél, a mezőkre a ez kulcsszó (például, ez a név és ezt.cím) és az argumentumok megegyeznek a mezők nevével (vagyis név és cím).

Vegye figyelembe, hogy konstruktor létrehozása ugyanazokkal az argumentumokkal, mint a létrehozott nyilvános konstruktor, érvényes, de ehhez minden mezőt kézzel kell inicializálni:

nyilvános nyilvántartás Személy (karakterlánc neve, karakterlánc címe) {nyilvános személy (karakterlánc neve, karakterlánc címe) {this.name = név; this.cím = cím; }}

Ezenkívül egy argumentum nélküli konstruktor és egy, a létrehozott konstruktornak megfelelő argumentumlista deklarálása fordítási hibát eredményez.

Ezért a következők nem állnak össze:

nyilvános nyilvántartás Személy (karakterlánc neve, karakterlánc címe) {nyilvános személy {Objects.requireNonNull (név); Objects.requireNonNull (cím); } public Person (karakterlánc neve, karakterlánc címe) {this.name = név; this.cím = cím; }}

5. Statikus változók és módszerek

Mint a szokásos Java osztályoknál, statikus változókat és módszereket is felvehetünk rekordjainkba.

Statikus változókat deklarálunk ugyanazzal a szintaxissal, mint egy osztály:

nyilvános nyilvántartás Személy (karakterlánc neve, karakterlánc címe) {public static karakterlánc Ismeretlen_ADDRESS = "Ismeretlen"; }

Hasonlóképpen statikus módszereket deklarálunk, ugyanazzal a szintaxissal, mint egy osztály:

nyilvános nyilvántartás Személy (karakterlánc neve, karakterlánc címe) {public static Személy meg nem nevezett (karakterlánc cím) {return new Person ("Névtelen", cím); }}

Ezután mind a statikus változókra, mind a statikus módszerekre hivatkozhatunk a rekord nevével:

Személy.NYELVEZTETHETŐ Személy.név ("100 Linda Ln.");

6. Következtetés

Ebben a cikkben megnéztük a rekord a Java 14-ben bevezetett kulcsszó, beleértve alapvető fogalmaikat és bonyolultságukat.

A rekordok használatával - a fordító által generált módszerekkel - csökkenthetjük a kazánlap kódját és javíthatjuk megváltoztathatatlan osztályaink megbízhatóságát.

Az oktatóanyag kódja és példái a GitHub oldalon találhatók.