KodeGym/Blog Jawa/Acak/Kelas Tunggal Jawa
John Squirrels
tingkat
San Francisco

Kelas Tunggal Jawa

Diterbitake ing grup
Hi! Dina iki kita bakal nyilem rincian macem-macem pola desain, diwiwiti kanthi pola Java Singleton. Ayo maneh: apa sing kita ngerti babagan pola desain umume? Pola desain minangka praktik paling apik sing bisa ditrapake kanggo ngatasi sawetara masalah sing dikenal. Pola desain umume ora ana gandhengane karo basa pamrograman. Mikir mau minangka pesawat saka Rekomendasi kanggo mbantu supaya kesalahane lan supaya reinventing setir.Pola desain: Singleton - 1

Apa sing diarani singleton ing basa Jawa?

Singleton minangka salah sawijining pola desain tingkat kelas sing paling gampang. Kadhangkala wong ngomong "kelas iki singleton", kang tegese kelas ngleksanakake pola desain singleton. Kadhangkala iku perlu kanggo nulis kelas ngendi kita matesi instantiation kanggo obyek siji. Contone, kelas tanggung jawab kanggo ngangkut barang utawa nyambung menyang a database. Pola desain singleton nggambarake carane kita bisa entuk iki. Singleton minangka pola desain sing nindakake rong perkara:
  1. Iku njamin yen mung bakal ana siji conto saka kelas.

  2. Iki nyedhiyakake siji titik akses global menyang conto kasebut.

Mula, ana rong fitur sing dadi karakteristik meh kabeh implementasine pola singleton:
  1. Konstruktor pribadi. Iki mbatesi kemampuan kanggo nggawe obyek saka kelas ing njaba kelas kasebut.

  2. Cara statis umum sing ngasilake conto kelas. Cara iki diarani getInstance . Iki minangka titik akses global menyang conto kelas.

Pilihan implementasine

Pola desain singleton ditrapake kanthi macem-macem cara. Saben pilihan apik lan ala kanthi cara dhewe. Kaya biasane, ora ana pilihan sing sampurna ing kene, nanging kita kudu ngupayakake siji. Kaping pisanan, ayo mutusake apa sing dadi apik lan ala, lan metrik apa sing mengaruhi cara kita netepake macem-macem implementasi pola desain. Ayo dadi miwiti karo apik. Ing ngisor iki faktor sing nggawe implementasine luwih jus lan menarik:
  • Inisialisasi kesed: instance ora digawe nganti dibutuhake.

  • Kode prasaja lan transparan: metrik iki, mesthi, subyektif, nanging penting.

  • Safety thread: operasi sing bener ing lingkungan multi-threaded.

  • Kinerja dhuwur ing lingkungan multi-utas: sithik utawa ora ana pamblokiran utas nalika nuduhake sumber daya.

Saiki cons. Kita bakal ndhaptar faktor sing ndadekake implementasine ora apik:
  • Ora ana initialization kesed: nalika kelas dimuat nalika aplikasi diwiwiti, preduli saka apa sing dibutuhake utawa ora (paradoxically, ing donya IT iku luwih apik kanggo kesed)

  • Kode Komplek lan angel diwaca. Metrik iki uga subyektif. Yen mripatmu wiwit getihen, kita bakal nganggep implementasine ora paling apik.

  • Lack saka safety thread. Ing tembung liyane, "bebaya thread". Operasi sing salah ing lingkungan multi-threaded.

  • Kinerja sing ora apik ing lingkungan multi-utas: benang mblokir saben liyane utawa asring nalika nuduhake sumber daya.

Kode

Saiki kita siyap nimbang macem-macem opsi implementasine lan nuduhake pro lan kontra:

Prasaja

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }
}
Implementasine paling gampang. Kaluwihan:
  • Kode prasaja lan transparan

  • Keamanan thread

  • Kinerja dhuwur ing lingkungan multi-threaded

Cons:
  • Ora initialization puguh.
Ing upaya kanggo ndandani kekurangan sadurunge, kita entuk implementasine nomer loro:

Inisialisasi malas

public class Singleton {
  private static final Singleton INSTANCE;

  private Singleton() {}

  public static Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
Kaluwihan:
  • Inisialisasi malas.

Cons:
  • Ora aman thread

Implementasi iki menarik. Kita bisa initialize lazily, nanging kita wis ilang safety thread. Aja kuwatir - kita nyinkronake kabeh ing implementasine nomer telu.

Akses sing disinkronake

public class Singleton {
  private static final Singleton INSTANCE;

  private Singleton() {
  }

  public static synchronized Singleton getInstance() {
    if (INSTANCE == null) {
      INSTANCE = new Singleton();
    }
    return INSTANCE;
  }
}
Kaluwihan:
  • Inisialisasi malas.

  • Keamanan thread

Cons:
  • Kinerja multithreaded sing ala

Banget! Ing implementasine nomer telu, kita mulihake safety thread! Mesthi, iku alon ... Saiki cara getInstance wis disinkronake, supaya bisa kaleksanan mung siji utas ing siji wektu. Tinimbang nyinkronake kabeh cara, kita mung kudu nyinkronake bagean kasebut sing miwiti conto anyar. Nanging kita ora bisa nggunakake blok sing disinkronake kanggo mbungkus bagean sing tanggung jawab kanggo nggawe conto anyar. Mengkono ora bakal njamin safety thread. Iku kabeh rada rumit. Sinkronisasi sing tepat bisa dideleng ing ngisor iki:

Ngunci dipriksa kaping pindho

public class Singleton {
    private static final Singleton INSTANCE;

  private Singleton() {
  }

    public static Singleton getInstance() {
        if (INSTANCE == null) {
            synchronized (Singleton.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}
Kaluwihan:
  • Inisialisasi malas.

  • Keamanan thread

  • Kinerja dhuwur ing lingkungan multi-threaded

Cons:
  • Ora didhukung ing versi Jawa sadurungé ing ngisor 1.5 (panggunaan tembung kunci molah malih tetep wiwit versi 1.5)

Elinga yen opsi implementasine iki bisa digunakake kanthi bener, salah siji saka rong kondisi kudu puas. Variabel INSTANCE kudu final utawa molah malih . Implementasi pungkasan sing bakal kita bahas dina iki yaiku singleton sing duwe kelas .

Sing duwe kelas

public class Singleton {

   private Singleton() {
   }

   private static class SingletonHolder {
       public static final Singleton HOLDER_INSTANCE = new Singleton();
   }

   public static Singleton getInstance() {
       return SingletonHolder.HOLDER_INSTANCE;
   }
}
Kaluwihan:
  • Inisialisasi malas.

  • Keamanan thread.

  • Kinerja dhuwur ing lingkungan multi-threaded.

Cons:
  • Operasi sing bener mbutuhake jaminan manawa obyek tunggal diinisialisasi tanpa kesalahan. Yen ora, telpon pisanan kanggo metode getInstance bakal ngasilake ExceptionInInitializerError , lan kabeh panggilan sakteruse bakal ngasilake NoClassDefFoundError .

Implementasine iki meh sampurna. Iku kesed, lan thread aman, lan cepet. Nanging nduweni nuansa, kaya sing diterangake ing dhaptar kontra. Perbandingan macem-macem implementasi pola singleton:
Implementasine Inisialisasi malas Keamanan thread kinerja multithreaded Nalika nggunakake?
Prasaja - + Cepet ora tau. Utawa bisa uga nalika initialization malas ora penting. Nanging ora bakal luwih apik.
Inisialisasi malas + - Ora ditrapake Tansah nalika multithreading ora dibutuhake
Akses sing disinkronake + + alon-alon ora tau. Utawa bisa uga nalika kinerja multithreaded ora Matter. Nanging ora bakal luwih apik.
Ngunci dipriksa kaping pindho + + Cepet Ing kasus langka nalika sampeyan kudu nangani pangecualian nalika nggawe singleton (nalika sing duwe kelas singleton ora ditrapake)
Sing duwe kelas + + Cepet Kapan multithreading dibutuhake lan ana jaminan manawa obyek tunggal bakal digawe tanpa masalah.

Pros lan cons saka pola singleton

Umumé, singleton nindakake apa sing dikarepake:
  1. Iku njamin yen mung bakal ana siji conto saka kelas.

  2. Iki nyedhiyakake siji titik akses global menyang conto kasebut.

Nanging, pola iki nduweni kekurangan:
  1. Singleton nglanggar prinsip tanggung jawab tunggal: saliyane tugas langsung, kelas singleton uga ngontrol jumlah kedadeyan.

  2. Ketergantungan kelas biasa marang singleton ora katon ing kontrak umum kelas kasebut.

  3. Variabel global ala. Pungkasane, siji-sijine dadi variabel global sing akeh banget.

  4. Ing ngarsane singleton nyuda testability saka aplikasi minangka kabèh lan kelas sing nggunakake singleton ing tartamtu.

Lan iku! :) Kita wis njelajah Kelas Singleton Jawa karo sampeyan. Saiki, ing salawas-lawase urip sampeyan, nalika ngobrol karo kanca-kanca programer, sampeyan ora mung bisa nyebutake pola sing apik, nanging uga sawetara tembung babagan apa sing nggawe ala. Sugeng nguwasani kawruh anyar iki.

Wacan tambahan:

Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar