JavaRush /Blog Jawa /Random-JV /Ngopi #143. Kelas sing disegel ing Jawa 17. 4 cara kanggo...

Ngopi #143. Kelas sing disegel ing Jawa 17. 4 cara kanggo ngetrapake Singleton

Diterbitake ing grup

Kelas sing disegel ing Jawa 17

Source: Codippa Ing kirim iki kita bakal katon ing kelas nutup, fitur anyar ngenalaken ing Jawa 17, lan carane wara-wara lan nggunakake karo conto. Ngopi #143.  Kelas sing disegel ing Jawa 17. 4 cara kanggo ngetrapake Singleton - 1Kelas sing disegel pisanan muncul ing Jawa 15 minangka fitur pratinjau, lan banjur ing Jawa 16 kanthi status sing padha. Fitur iki dadi kebak fungsi karo release saka Java 17 ( JEP 409 ).

Apa kelas sing disegel?

Kelas sing disegel ngidini sampeyan mbatesi utawa milih subkelas. Kelas ora bisa ngluwihi kelas pribadhi kajaba ana ing dhaptar kelas induk kelas anak sing diidini. Kelas kasebut disegel nggunakake tembung kunci sing disegel . Kelas sing disegel kudu diikuti karo tembung kunci ijin , bebarengan karo dhaptar kelas sing bisa ngluwihi. Iki contone:
public sealed class Device permits Computer, Mobile {
}
Pranyatan iki tegese Piranti mung bisa ditambahake dening kelas Komputer lan Seluler . Yen kelas liyane nyoba ngluwihi, kesalahan compiler bakal dibuwang. Kelas sing ngluwihi kelas sing disegel kudu duwe tembung kunci pungkasan , disegel , utawa ora disegel ing deklarasi . Mangkono kita duwe hirarki kelas tetep. Kepiye hubungane karo nggawe kelas bocah?
  1. final tegese iku ora bisa luwih subclassed.

  2. disegel tegese kita kudu ngumumake kelas anak kanthi ijin .

  3. non-sealed tegese kene kita mungkasi hirarki wong tuwa-anak .

Contone, Komputer ngidini kelas Laptop lan Desktop anggere Laptop dhewe tetep ora disegel . Iki tegese Laptop bisa ditambah karo kelas kayata Apple , Dell , HP lan liya-liyane.

Tujuan utama ngenalake kelas sing disegel yaiku:

  1. Nganti saiki, sampeyan mung bisa mbatesi ekstensi kelas nggunakake tembung kunci pungkasan . A kontrol kelas nutup kang kelas bisa ngluwihi dening kalebu ing dhaftar diijini.

  2. Iki uga ngidini kelas kanggo ngontrol endi sing bakal dadi kelas anak.

Aturan

Sawetara aturan sing kudu dielingi nalika nggunakake kelas sing disegel:
  1. Kelas sing disegel kudu nemtokake kelas sing bisa ngluwihi nggunakake ijin . Iki ora dibutuhake yen kelas anak ditetepake ing kelas induk minangka kelas batin.

  2. Kelas anak kudu dadi final , disegel , utawa ora disegel .

  3. Kelas anak sing diidini kudu ngluwihi kelas sing disegel wong tuwa.

    Yaiku, yen kelas A sing disegel ngidini kelas B, mula B kudu ngluwihi A.

  4. Yen kelas nutup ing modul, banjur kelas anak uga kudu ing modul padha, utawa ing paket padha yen tuwane kelas nutup ing modul unnamed.

  5. Mung kelas sing diidini langsung bisa ngluwihi kelas sing disegel. Yaiku, yen A minangka kelas sing disegel sing ngidini B ngluwihi, mula B uga minangka kelas sing disegel sing ngidini C.

    Banjur C mung bisa ngluwihi B, nanging ora bisa langsung ngluwihi A.

Antarmuka sing disegel

Kaya kelas sing disegel, antarmuka uga bisa disegel. Antarmuka kasebut bisa ngidini pilihan antarmuka utawa kelas anak, sing bisa ngluwihi ijin . Iki conto sing apik:
public sealed interface Device permits Electronic, Physical,
DeviceImpl {
}
Ing kene, antarmuka Piranti ngidini antarmuka Elektronik lan Fisik kanggo ngluwihi lan kelas DeviceImpl kanggo implementasine sabanjure.

Cathetan sing disegel

kelas Sealed bisa digunakake karo entri ngenalaken ing Jawa 16. Entri ora bisa ngluwihi kelas biasa, supaya mung bisa ngleksanakake antarmuka pribadi. Kajaba iku, notasi kasebut nuduhake final . Mula, entri ora bisa nggunakake tembung kunci ijin amarga ora bisa disubklasifikasi. Tegese, mung ana hirarki tingkat siji kanthi cathetan. Iki contone:
public sealed interface Device permits Laptop {
}
public record Laptop(String brand) implement Device {
}

Dhukungan refleksi

Java Reflection nyedhiyakake dhukungan kanggo kelas sing disegel. Rong cara ing ngisor iki wis ditambahake menyang java.lang.Class :

1. getPermittedSubclasses()

Iki ngasilake java.lang.Class Uploaded ngemot kabeh kelas diijini dening obyek kelas iki. Tuladha:
Device c = new Device();
Class<? extends Device> cz = c.getClass();
Class<?>[] permittedSubclasses = cz.getPermittedSubclasses();
for (Class<?> sc : permittedSubclasses){
  System.out.println(sc.getName());
}
Kesimpulan:
Komputer Mobile

2. Disegel ()

Iki ngasilake bener yen kelas utawa antarmuka sing diarani disegel. Mangkono saiki babagan kelas sing disegel sing ditambahake ing basa Jawa 17. Muga-muga artikel iki informatif.

4 Cara Ngleksanakake Singleton

Sumber: Medium Dina iki sampeyan bakal sinau sawetara cara kanggo ngetrapake pola desain Singleton. Pola desain Singleton akeh digunakake ing proyek Jawa. Iki nyedhiyakake kontrol akses menyang sumber daya, kayata soket utawa sambungan database. Aku tau dijaluk ngleksanakake singleton sajrone wawancara kanggo posisi pangembang web ing perusahaan chip gedhe. Iki minangka pisanan wawancara kanggo posisi web, lan aku ora nindakake persiapan sing akeh, mula aku milih solusi sing paling angel: Instansiasi kesed. Kodeku mung 90% bener lan ora cukup efisien, akhire aku kalah ing babak final... Dadi muga-muga artikelku bisa migunani kanggo sampeyan.

Instalasi Awal

class Singleton {
    private Singleton() {}
    private static Singleton instance = new Singleton();

    public static Singleton getInstance() {
        return instance;
    }
}
Wiwit obyek wis digawe nalika initialization, ora ana masalah safety thread kene, nanging ora sampah sumber memori yen ora ana sing nggunakake.

Kesed implementasine

class Singleton {
    private static Singleton instance = null;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
Nalika nggunakake pola initialization puguh, obyek digawe ing dikarepake. Nanging, cara iki duwe masalah safety thread: yen loro Utas diwiwiti ing baris 5 bebarengan, padha bakal nggawe loro kedadean Singleton. Kanggo ngindhari iki, kita kudu nambah kunci:
class Singleton {
    private Singleton() {}
    private static Singleton instance = null;

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
Double-Checked Locking (DCL): Ora ana kunci ing baris 6, mula baris iki bakal cepet banget yen obyek wis digawe. Napa kita kudu mriksa ulang conto == null ? Amarga mbok menawa ana loro Utas ngenalaken ing baris 7: pisanan miwiti obyek, kaloro nunggu kunci Singleton.class . Yen ora ana mriksa, banjur thread kapindho bakal maneh obyek singleton. Nanging, cara iki isih mbebayani kanggo benang. Baris 9 bisa dipérang dadi telung baris kode byte:
  1. Alokasi memori.
  2. Iki obyek.
  3. Nemtokake obyek kanggo referensi conto.
Amarga JVM bisa entek, mesin virtual bisa nemtokake obyek menyang referensi conto sadurunge initialization. Utas liyane wis ndeleng conto != null , mula bakal digunakake lan nyebabake masalah. Dadi, kita kudu nambah molah malih menyang conto, banjur kode dadi kaya iki:
class Singleton {
    private Singleton() {}
    private volatile static Singleton instance = null;

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

Nggunakake kelas batin statis

public class Singleton {
  private Singleton() {}
  private static class SingletonHolder {
    private static final Singleton INSTANCE = new Singleton();
  }
  public static final Singleton getInstance() {
    return SingletonHolder.INSTANCE;
  }
}
SingletonHolder minangka kelas batin statis, mung diwiwiti nalika metode getInstance diarani . Kelas init ing JVM bakal mbukak <clinit> cmd , banjur JVM dhewe bakal nggawe manawa mung siji utas sing bisa nelpon <clinit> ing kelas target, benang liyane bakal ngenteni.

Enum minangka singleton

public enum EnumSingleton {
    INSTANCE;
    int value;
    public int getValue() {
        return value;
    }
    public int setValue(int v) {
        this.value = v;
    }
}
Kanthi gawan, conto enum aman kanggo benang, mula ora perlu kuwatir babagan kunci sing dicenthang kaping pindho, lan cukup gampang kanggo nulis.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION