JavaRush /Blog Jawa /Random-JV /Ngopi #128. Pedoman Rekam Jawa

Ngopi #128. Pedoman Rekam Jawa

Diterbitake ing grup
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. Ngopi #128.  Pandhuan Cathetan Jawa - 1

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.
Wiwit kelas Kontak wis ora bisa diganti, kita saiki:
  1. nggawe lapangan pribadi lan final .
  2. 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:
  1. Kolom jeneng lan email minangka pribadi lan pungkasan minangka standar.

  2. Kode kasebut nemtokake "konstruktor kanonik" sing njupuk kolom minangka paramèter.

  3. Kolom bisa diakses liwat metode kaya getter - jeneng () lan email () . Ora ana setter kanggo lapangan, supaya data ing obyek dadi immutable.

  4. Dilaksanakake metode toString kanggo nyithak kolom kaya sing ditindakake kanggo kelas Kontak .

  5. 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.

Kesimpulan

Rekaman minangka cara sing apik kanggo nemtokake kelas data. Dheweke luwih trep lan kuat tinimbang pendekatan JavaBeans/POJO. Amarga gampang dileksanakake, kudu luwih disenengi tinimbang cara liya kanggo nggawe obyek nilai.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION