Java 14 Record Keyword

1. Introduktion

At videregive uforanderlige data mellem objekter er en af ​​de mest almindelige, men verdslige opgaver i mange Java-applikationer.

Forud for Java 14 krævede dette oprettelse af en klasse med kedelpladefelter og -metoder, som var modtagelige for trivielle fejl og forvirrede intentioner.

Med frigivelsen af ​​Java 14 kan vi nu bruge poster til at afhjælpe disse problemer.

I denne vejledning vi ser på det grundlæggende i optegnelser, herunder deres formålgenererede metoder og tilpasningsteknikker.

2. Formål

Almindeligvis skriver vi klasser for simpelthen at holde data, såsom databaseresultater, forespørgselsresultater eller information fra en tjeneste.

I mange tilfælde er disse data uforanderlige, siden uforanderlighed sikrer gyldigheden af ​​dataene uden synkronisering.

For at opnå dette opretter vi dataklasser med følgende:

  1. privat, endelig felt for hvert stykke data
  2. getter for hvert felt
  3. offentlig konstruktør med et tilsvarende argument for hvert felt
  4. lige med metode, der vender tilbage rigtigt for objekter af samme klasse, når alle felter matcher
  5. hashCode metode, der returnerer den samme værdi, når alle felter matcher
  6. toString metode, der inkluderer navnet på klassen og navnet på hvert felt og dets tilsvarende værdi

For eksempel kan vi oprette en simpel Person dataklasse med navn og adresse:

offentlig klasse person {privat endelig strengnavn; privat endelig streng adresse; offentlig person (strengnavn, strengadresse) {this.name = navn; denne.adresse = adresse; } @ Override public int hashCode () {return Objects.hash (navn, adresse); } @ Override offentlige booleske er lig med (Objekt obj) {hvis (dette == obj) {returner sandt; } ellers hvis (! (obj instans af person)) {returner falsk; } andet {Person anden = (Person) obj; returnere Objects.equals (navn, andet.navn) && Objects.equals (adresse, andet.adresse); }} @Override public String toString () {return "Person [name =" + name + ", address =" + address + "]"; } // standard getters}

Mens dette opfylder vores mål, er der to problemer med det:

  1. Der er en masse kedelpladekode
  2. Vi tilslører formålet med vores klasse - at repræsentere en person med navn og adresse

I det første tilfælde skal vi gentage den samme kedelige proces for hver dataklasse, monotont skabe et nyt felt for hvert stykke data, skabe lige med, hashCodeog toString metoder og skabe en konstruktør, der accepterer hvert felt.

Mens IDE'er automatisk kan generere mange af disse klasser, de opdaterer ikke automatisk vores klasser automatisk, når vi tilføjer et nyt felt. For eksempel, hvis vi tilføjer et nyt felt, skal vi opdatere vores lige med metode til at indarbejde dette felt.

I det andet tilfælde den ekstra kode tilslører, at vores klasse simpelthen er en dataklasse der har to Snor felter: navn og adresse.

En bedre tilgang ville være at udtrykkeligt erklære, at vores klasse er en dataklasse.

3. Grundlæggende

Fra og med JDK 14 kan vi erstatte vores gentagne dataklasser med poster. Records er uforanderlige dataklasser, der kun kræver typen og navnet på felterne.

Det lige med, hashCodeog toString metoder samt privat, endelig felter og offentlig konstruktør, genereres af Java-kompilatoren.

At oprette en Person registrere, bruger vi optage nøgleord:

offentlig optegnelse person (strengnavn, strengadresse) {}

3.1. Konstruktør

Ved hjælp af poster genereres en offentlig konstruktør - med et argument for hvert felt - for os.

I tilfælde af vores Person rekord, den tilsvarende konstruktør er:

offentlig person (strengnavn, strengadresse) {this.name = navn; denne.adresse = adresse; }

Denne konstruktør kan bruges på samme måde som en klasse til at instantiere objekter fra posten:

Person person = ny person ("John Doe", "100 Linda Ln.");

3.2. Getters

Vi modtager også offentlige getters-metoder - hvis navne matcher navnet på vores felt - gratis.

I vores Person rekord, det betyder en navn() og adresse() getter:

@Test offentlig ugyldighed givenValidNameAndAddress_whenGetNameAndAddress_thenExpectedValuesReturned () {String name = "John Doe"; Strengadresse = "100 Linda Ln."; Person person = ny person (navn, adresse); assertEquals (navn, person.navn ()); assertEquals (adresse, person.adresse ()); }

3.3. lige med

Derudover an lige med metode genereres for os.

Denne metode vender tilbage rigtigt hvis det leverede objekt er af samme type, og værdierne for alle dets felter matcher:

@Test offentlig ugyldighed givenSameNameAndAddress_whenEquals_thenPersonsEqual () {String name = "John Doe"; Strengadresse = "100 Linda Ln."; Person person1 = ny person (navn, adresse); Person person2 = ny person (navn, adresse); assertTrue (person1.equals (person2)); }

Hvis nogle af felterne er forskellige mellem to Person tilfælde, den lige med metoden vender tilbage falsk.

3.4. hashCode

Svarende til vores lige med metode, en tilsvarende hashCode Metoden genereres også for os.

Vores hashCode metode returnerer den samme værdi for to Person objekter, hvis alle feltværdierne for begge objekter stemmer overens (spærring af kollisioner på grund af fødselsdagsparadoxet):

@ Test offentligt ugyldigt givenSameNameAndAddress_whenHashCode_thenPersonsEqual () {String name = "John Doe"; Strengadresse = "100 Linda Ln."; Person person1 = ny person (navn, adresse); Person person2 = ny person (navn, adresse); assertEquals (person1.hashCode (), person2.hashCode ()); } 

Det hashCode værdien vil variere, hvis nogen af ​​feltværdierne er forskellige.

3.5. toString

Endelig modtager vi også entoString metode, der resulterer i en streng, der indeholder postens navn efterfulgt af navnet på hvert felt og dets tilsvarende værdi i firkantede parenteser.

Derfor instantere en Person med navnet på “John Doe” og en adresse på “100 Linda Ln.”Resulterer i følgende toString resultat:

Person [navn = John Doe, adresse = 100 Linda Ln.]

4. Konstruktører

Mens der genereres en offentlig konstruktør til os, kan vi stadig tilpasse vores konstruktørimplementering.

Denne tilpasning er beregnet til at blive anvendt til validering og skal holdes så enkel som muligt.

For eksempel kan vi sikre, at navn og adresse leveres til vores Person rekord er ikke nul ved hjælp af følgende konstruktørimplementering:

offentlig optegnelse Person (String name, String address) {public Person {Objects.requireNonNull (name); Objects.requireNonNull (adresse); }}

Vi kan også oprette nye konstruktører med forskellige argumenter ved at levere en anden argumentliste:

offentlig optegnelse Person (strengnavn, strengadresse) {offentlig person (strengnavn) {dette (navn, "ukendt"); }}

Som med klassekonstruktører, felterne kan henvises til ved hjælp af det her nøgleord (for eksempel, dette.navn og denne. adresse) og argumenterne matcher navnet på felterne (det er, navn og adresse).

Noter det oprettelse af en konstruktør med de samme argumenter som den genererede offentlige konstruktør er gyldig, men dette kræver, at hvert felt initialiseres manuelt:

offentlig optegnelse Person (strengnavn, strengadresse) {offentlig person (strengnavn, strengadresse) {dette.navn = navn; denne.adresse = adresse; }}

Derudover at erklære en konstruktør uden argument og en med en argumenteliste, der matcher den genererede konstruktor, resulterer i en kompileringsfejl.

Derfor kompileres ikke følgende:

offentlig optegnelse Person (String name, String address) {public Person {Objects.requireNonNull (name); Objects.requireNonNull (adresse); } offentlig person (strengnavn, strengadresse) {dette.navn = navn; denne.adresse = adresse; }}

5. Statiske variabler og metoder

Som med almindelige Java-klasser, Vi kan også inkludere statiske variabler og metoder i vores optegnelser.

Vi erklærer statiske variabler ved hjælp af den samme syntaks som en klasse:

public record Person (String name, String address) {public static String UNKNOWN_ADDRESS = "Ukendt"; }

Ligeledes erklærer vi statiske metoder ved hjælp af samme syntaks som en klasse:

offentlig optegnelse Person (strengnavn, strengadresse) {offentlig statisk person, der ikke er navngivet (strengadresse) {returner ny person ("ubekendt", adresse); }}

Vi kan derefter henvise til både statiske variabler og statiske metoder ved hjælp af postens navn:

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

6. Konklusion

I denne artikel kiggede vi på optage nøgleord introduceret i Java 14, herunder deres grundlæggende begreber og indviklinger.

Ved hjælp af poster - med deres compiler-genererede metoder - kan vi reducere kedelpladekoden og forbedre pålideligheden af ​​vores uforanderlige klasser.

Koden og eksemplerne til denne vejledning kan findes på GitHub.


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