Sumber: abhinavpandey.dev Ing tutorial iki, kita bakal ngrembug babagan dhasar nggunakake Records ing Jawa. Records padha ngenalaken ing Jawa 14 minangka cara kanggo mbusak kode boilerplate watara nitahaken saka obyek Nilai nalika njupuk kauntungan saka obyek immutable.
1. Konsep dhasar
Sadurunge kita mlebu menyang entri dhewe, ayo goleki masalah sing dipecahake. Kanggo nindakake iki, kita kudu ngelingi carane obyek nilai digawe sadurunge Java 14.1.1. Nilai obyek
Objek nilai minangka bagean integral saka aplikasi Java. Padha nyimpen data sing kudu ditransfer antarane lapisan aplikasi. Objek nilai ngemot kolom, konstruktor, lan cara kanggo ngakses kolom kasebut. Ing ngisor iki minangka conto obyek nilai:public class Contact {
private final String name;
private final String email;
public Contact(String name, String email) {
this.name = name;
this.email = email;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
}
1.2. Kesetaraan antarane obyek Nilai
Objek nilai uga bisa menehi cara kanggo mbandhingake kanggo kesetaraan. Kanthi gawan, Jawa mbandhingake kesetaraan obyek kanthi mbandhingake alamat memori. Nanging, ing sawetara kasus, obyek sing ngemot data sing padha bisa dianggep padha. Kanggo ngleksanakake iki, kita bisa ngalahake padha lan .hashCode cara . Ayo dileksanakake kanggo kelas Kontak :public class Contact {
// ...
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Contact contact = (Contact) o;
return Object.equals(email, contact.email) &&
Objects.equals(name, contact.name);
}
@Override
public int hashCode() {
return Objects.hash(name, email);
}
}
1.3. Immutability saka obyek Nilai
Objek nilai kudu ora bisa diganti. Iki tegese kita kudu mbatesi cara kita bisa ngganti lapangan obyek. Iki dianjurake kanggo alasan ing ngisor iki:- Kanggo ngindhari risiko kanthi ora sengaja ngganti nilai lapangan.
- Kanggo mesthekake yen obyek sing padha tetep padha ing saindhenging urip.
- nggawe lapangan pribadi lan final .
- kasedhiya mung getter kanggo saben lapangan (ora ana setters ).
1.4. Ndhaptar obyek Nilai
Asring kita kudu ndhaptar nilai sing ana ing obyek. Iki ditindakake kanthi menehi metode toString . Nalika obyek didaftar utawa dicithak, metode toString diarani . Cara paling gampang ing kene yaiku nyithak nilai saben lapangan. Iki contone:public class Contact {
// ...
@Override
public String toString() {
return "Contact[" +
"name='" + name + '\'' +
", email=" + email +
']';
}
}
2. Ngurangi cithakan karo Records
Amarga umume obyek nilai duwe kabutuhan lan fungsi sing padha, luwih becik nyederhanakake proses nggawe. Ayo goleki carane rekaman mbantu entuk iki.2.1. Ngonversi kelas Person menyang Rekam
Ayo nggawe entri kelas Kontak sing nduweni fungsi sing padha karo kelas Kontak sing ditetepake ing ndhuwur.public record Contact(String name, String email) {}
Tembung kunci rekaman digunakake kanggo nggawe kelas Rekam . Rekaman bisa diproses dening panelpon kanthi cara sing padha karo kelas. Contone, kanggo nggawe conto entri anyar, kita bisa nggunakake tembung kunci anyar .
Contact contact = new Contact("John Doe", "johnrocks@gmail.com");
2.2. Prilaku Default
Kita wis nyuda kode dadi siji baris. Ayo dhaptar apa sing kalebu:-
Kolom jeneng lan email minangka pribadi lan pungkasan minangka standar.
-
Kode kasebut nemtokake "konstruktor kanonik" sing njupuk kolom minangka paramèter.
-
Kolom bisa diakses liwat metode kaya getter - jeneng () lan email () . Ora ana setter kanggo lapangan, supaya data ing obyek dadi immutable.
-
Dilaksanakake metode toString kanggo nyithak kolom kaya sing ditindakake kanggo kelas Kontak .
-
Dilaksanakake witjaksono lan .hashCode cara . Iki kalebu kabeh lapangan, kaya kelas Kontak .
2.3 Konstruktor kanonik
Konstruktor standar njupuk kabeh kolom minangka parameter input lan nyetel menyang lapangan. Contone, Konstruktor Canonical standar ditampilake ing ngisor iki:public Contact(String name, String email) {
this.name = name;
this.email = email;
}
Yen kita nemtokake konstruktor karo teken padha ing kelas rekaman, iku bakal digunakake tinimbang konstruktor kanonik.
3. Nggarap cathetan
Kita bisa ngganti prilaku entri ing sawetara cara. Ayo goleki sawetara kasus panggunaan lan carane entuk.3.1. Overriding implementasine gawan
Sembarang implementasine standar bisa diganti kanthi overriding. Contone, yen kita pengin ngganti prilaku cara toString , banjur kita bisa override antarane kurung kriting {} .public record Contact(String name, String email) {
@Override
public String toString() {
return "Contact[" +
"name is '" + name + '\'' +
", email is" + email +
']';
}
}
Kajaba iku, kita bisa ngatasi metode sing padha lan kode hash .
3.2. Kit konstruksi kompak
Kadhangkala kita pengin konstruktor nindakake luwih saka mung miwiti lapangan. Kanggo nindakake iki, kita bisa nambah operasi sing dibutuhake kanggo entri ing Compact Constructor. Disebut kompak amarga ora perlu nemtokake initialization lapangan utawa dhaptar parameter.public record Contact(String name, String email) {
public Contact {
if(!email.contains("@")) {
throw new IllegalArgumentException("Invalid email");
}
}
}
Elinga yen ora ana dhaptar paramèter, lan wiwitan jeneng lan email ana ing latar mburi sadurunge mriksa ditindakake.
3.3. Nambahake Konstruktor
Sampeyan bisa nambah sawetara konstruktor menyang rekaman. Ayo goleki sawetara conto lan watesan. Pisanan, ayo nambah konstruktor sing sah anyar:public record Contact(String name, String email) {
public Contact(String email) {
this("John Doe", email);
}
// replaces the default constructor
public Contact(String name, String email) {
this.name = name;
this.email = email;
}
}
Ing kasus sing sepisanan, konstruktor standar diakses nggunakake tembung kunci iki . Konstruktor kaloro overrides konstruktor gawan amarga wis dhaftar parameter padha. Ing kasus iki, entri kasebut ora bakal nggawe konstruktor standar. Ana sawetara watesan ing konstruktor.
1. Konstruktor standar kudu tansah disebut saka konstruktor liyane.
Contone, kode ing ngisor iki ora bakal dikompilasi:public record Contact(String name, String email) {
public Contact(String name) {
this.name = "John Doe";
this.email = null;
}
}
Aturan iki njamin yen lapangan tansah diinisialisasi. Uga dijamin operasi sing ditetepake ing konstruktor kompak tansah dileksanakake.
2. Ora bisa ngalahake konstruktor standar yen konstruktor kompak ditetepake.
Nalika konstruktor kompak ditetepake, konstruktor gawan digawe kanthi otomatis kanthi initialization lan logika konstruktor kompak. Ing kasus iki, kompiler ora ngidini kita nemtokake konstruktor kanthi argumen sing padha karo konstruktor standar. Contone, ing kode iki kompilasi ora bakal kelakon:public record Contact(String name, String email) {
public Contact {
if(!email.contains("@")) {
throw new IllegalArgumentException("Invalid email");
}
}
public Contact(String name, String email) {
this.name = name;
this.email = email;
}
}
3.4. Implementasine Antarmuka
Kaya kelas apa wae, kita bisa ngetrapake antarmuka ing cathetan.public record Contact(String name, String email) implements Comparable<Contact> {
@Override
public int compareTo(Contact o) {
return name.compareTo(o.name);
}
}
Cathetan penting. Kanggo mesthekake immutability lengkap, cathetan ora bisa dipun warisaken. Entri final lan ora bisa ditambahi. Dheweke uga ora bisa ngluwihi kelas liyane.
3.5. Nambahake Metode
Saliyane konstruktor, sing ngatasi metode lan implementasi antarmuka, kita uga bisa nambah cara sing dikarepake. Tuladhane:public record Contact(String name, String email) {
String printName() {
return "My name is:" + this.name;
}
}
Kita uga bisa nambah cara statis. Contone, yen kita pengin duwe cara statis sing ngasilake ekspresi biasa sing bisa dipriksa email, mula kita bisa nemtokake kaya ing ngisor iki:
public record Contact(String name, String email) {
static Pattern emailRegex() {
return Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);
}
}
3.6. Nambah lapangan
Kita ora bisa nambah lapangan conto menyang rekaman. Nanging, kita bisa nambah kolom statis.public record Contact(String name, String email) {
private static final Pattern EMAIL_REGEX_PATTERN = Pattern
.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);
static Pattern emailRegex() {
return EMAIL_REGEX_PATTERN;
}
}
Elinga yen ora ana watesan implisit ing kolom statis. Yen perlu, bisa uga kasedhiya kanggo umum lan ora final.
GO TO FULL VERSION