CodeGym /Java Blog /Acak /Pola dan Singleton di Jawa
John Squirrels
Level 41
San Francisco

Pola dan Singleton di Jawa

Dipublikasikan di grup Acak
Artikel ini ditujukan untuk siapa saja yang, untuk pertama kalinya, menjumpai konsep pola desain, pernah mendengar istilah singleton , atau entah bagaimana menerapkan pola singleton tetapi tidak mengerti apa yang sedang terjadi. Selamat datang! Siswa CodeGym menemukan pola desain untuk pertama kalinya di Level 15, saat kapten tiba-tiba meminta mereka untuk "memperkuat" pemahaman mereka dengan menerapkan pola Java Singleton dengan implementasi lambat. Siswa yang mendengar tentang pola tunggal untuk pertama kalinya langsung memiliki banyak pertanyaan: apa sebenarnya pola desain itu? Mengapa kita membutuhkannya? Apa itu tunggal ? Dan terakhir, apa itu implementasi malas? Mari kita jawab pertanyaan ini secara berurutan.

Apa di dunia adalah pola desain?

Saya percaya sedikit sejarah adalah untuk menjawab pertanyaan ini dengan pemahaman terbaik. Ada empat penulis pemrograman terkenal (Erich Gamma, John Vlissides, Ralph Johnson, dan Richard Helm) yang memiliki ide menarik. Mereka memperhatikan bahwa pengembangan perangkat lunak sering kali mengharuskan mereka untuk menyelesaikan masalah yang kira-kira sama dan menulis kode yang terstruktur dengan cara yang sama. Jadi mereka memutuskan untuk mendeskripsikan pola tipikal yang seringkali perlu digunakan dalam pemrograman berorientasi objek. Buku mereka diterbitkan pada tahun 1994 dengan judul Design Patterns: Elements of Reusable Object-Oriented Software. Nama buku itu ternyata terlalu panjang dan orang-orang mulai menyebutnya buku Gang of Four. Edisi pertama menyertakan 23 pola. Setelah itu, puluhan pola lain ditemukan.
Pola desain adalah solusi standar untuk masalah umum.
Dan pola singleton hanyalah salah satunya.

Mengapa kita membutuhkan pola desain?

Anda dapat memprogram tanpa mengetahui pola: lagipula, pada Level 15, Anda telah menulis ratusan program mini di CodeGym bahkan tanpa mengetahui keberadaannya. Ini menunjukkan bahwa pola desain adalah sejenis alat yang penggunaannya membedakan master dari amatir: Pola desain menjelaskan cara memecahkan masalah tipikal dengan benar. Ini berarti mengetahui pola menghemat waktu Anda. Dengan cara itu, mereka mirip dengan algoritma. Misalnya, Anda dapat membuat algoritme penyortiran sendiri dengan blackjack dan angkadan menghabiskan banyak waktu untuk melakukannya, atau Anda dapat mengimplementasikan yang telah dipahami dan dijelaskan sejak lama. Hal yang sama berlaku dengan pola desain. Selain itu, dengan pola desain, kode menjadi lebih standar, dan saat menggunakan pola yang sesuai, kecil kemungkinan Anda membuat kesalahan, karena perangkap umum pola telah diidentifikasi dan dihilangkan sejak lama. Di atas segalanya, pengetahuan tentang pola membantu programmer memahami satu sama lain dengan lebih baik. Anda cukup menyebutkan nama pola alih-alih mencoba memberikan penjelasan panjang lebar kepada sesama pemrogram. Kesimpulannya, pola desain membantu Anda:
  • tidak menemukan kembali roda, melainkan menggunakan solusi standar;
  • standarisasi kode;
  • standarisasi terminologi;
Untuk menyimpulkan bagian ini, kami mencatat bahwa seluruh tubuh pola desain dapat dibagi menjadi tiga kelompok besar: Pola dan singleton - untuk semua orang yang menemukannya untuk pertama kali - 2

Akhirnya, pola tunggal

Singleton adalah pola penciptaan . Pola ini memastikan bahwa hanya ada satu instance kelas dan menyediakan jalur akses global untuk objek ini. Dari uraian tersebut, harus jelas bahwa pola ini harus diterapkan dalam dua kasus:
  1. ketika program Anda mengharuskan tidak lebih dari satu objek dari kelas tertentu harus dibuat. Misalnya, game komputer mungkin memiliki kelas Pahlawan dan hanya satu objek Pahlawan yang menggambarkan satu-satunya pahlawan dalam game tersebut.

  2. ketika Anda perlu memberikan titik untuk akses global ke suatu objek. Dengan kata lain, Anda perlu membuat objek tersedia dari mana saja dalam program. Sayangnya, tidak cukup hanya membuat variabel global, karena tidak dilindungi dari penulisan: siapa pun dapat mengubah nilai variabel, sehingga titik akses global objek mungkin hilang. Properti Singleton ini diperlukan, misalnya, saat Anda memiliki objek yang bekerja dengan database, dan Anda perlu mengakses database dari berbagai bagian program. Singleton akan memastikan bahwa tidak ada yang menulis kode yang menggantikan instance yang dibuat sebelumnya.
Jadi Singleton memenuhi dua kebutuhan ini: harus ada hanya satu dari jenis objek tertentu dalam program dan harus ada akses global ke sana. Pada contoh di Level 15, kapten meminta Anda menerapkan pola ini untuk tugas berikut:
  1. Temukan contoh Singleton dengan inisialisasi malas.

  2. Buat tiga kelas tunggal — Matahari, Bulan, Bumi — dalam file terpisah menggunakan prinsip yang sama.

  3. MelaksanakanPlanetantarmuka di kelas Matahari , Bulan dan Bumi .

  4. Di blok statis kelas Solusi , panggilreadKeyFromConsoleAndInitPlanetmetode.

  5. MenerapkanreadKeyFromConsoleAndInitPlanetfungsionalitas metode:

    • 5.1. Baca satu parameter String dari konsol

    • 5.2. Jika parameter sama dengan salah satu dariPlanetkonstanta antarmuka, buat objek Planet yang sesuai .

Setelah membaca kondisi tugas dengan cermat, kami dapat dengan jelas melihat mengapa Singleton diperlukan di sini. Memang, kita diminta untuk membuat instance dari masing-masing kelas berikut: Sun , Moon , Earth . Masuk akal untuk berasumsi bahwa kita harus membuat tidak lebih dari satu Matahari/Bulan/Bumi. Kalau tidak, kita masuk ke dalam situasi yang tidak masuk akal, kecuali tentu saja Anda menulis Star Wars versi Anda sendiri. Menerapkan pola Singleton di Java dalam tiga langkah Di Java, perilaku Singleton tidak dapat diimplementasikan menggunakan konstruktor biasa, karena konstruktor selalu mengembalikan objek baru. Oleh karena itu, semua implementasi Singletonbermuara pada menyembunyikan konstruktor, membuat metode statis publik yang mengontrol masa pakai objek tunggal, dan "menghancurkan" semua objek yang baru muncul. Jika Singleton diakses, itu harus membuat objek baru (jika belum ada dalam program), atau mengembalikan yang sudah ada. Untuk menyelesaikan ini:
  1. Anda perlu memberi kelas bidang statis pribadi yang menyimpan satu objek:

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance; // #1
    }
    
  2. Jadikan konstruktor (default) pribadi. Ini berarti tidak dapat diakses di luar kelas dan tidak akan dapat mengembalikan objek baru:

    
    public class LazyInitializedSingleton {
    	private static LazyInitializedSingleton instance;
    private LazyInitializedSingleton(){} // #2
    } 
    
  3. Deklarasikan metode pembuatan statis yang akan digunakan untuk mendapatkan singleton:

    
    public class LazyInitializedSingleton {
        private static LazyInitializedSingleton instance;
            private LazyInitializedSingleton() {}
            public static LazyInitializedSingleton getInstance() { // #3
            if (instance == null) { // If the object has not yet been created
                instance = new LazyInitializedSingleton(); // Create a new object
            }
            return instance; // Return the previously created object
        }
    }
    
Contoh di atas agak kikuk, karena kita hanya menyembunyikan konstruktor dan menyediakan metode kita sendiri, bukan konstruktor standar. Karena artikel ini bertujuan untuk memastikan bahwa siswa CodeGym bersentuhan dengan pola ini (dan pola desain secara umum), nuansa implementasi singleton yang lebih kompleks tidak akan dijelaskan di sini. Kami hanya mencatat bahwa, bergantung pada kerumitan program, pola ini mungkin perlu disempurnakan lebih lanjut. Misalnya, dalam lingkungan multithread (lihat artikel tentang utas), beberapa utas berbeda dapat mengakses metode singleton secara bersamaan, dan kode yang dijelaskan di atas akan berhenti berfungsi, karena setiap utas terpisah dapat membuat turunan dari kelas. Akibatnya, masih ada beberapa pendekatan berbeda untuk membuat singleton thread-safe yang tepat. Tapi itu cerita lain =)

Dan akhirnya... Inisialisasi malas apa yang ditanyakan kapten ini?

Inisialisasi malas juga disebut inisialisasi yang ditangguhkan. Ini adalah trik pemrograman di mana operasi intensif sumber daya (dan membuat objek adalah operasi intensif sumber daya) dilakukan sesuai permintaan, bukan sebelumnya. Jadi apa yang sebenarnya terjadi pada kode Singleton Java kita? Dengan kata lain, objek kita dibuat saat diakses, bukan sebelumnya. Anda tidak boleh berasumsi bahwa inisialisasi malas entah bagaimana terikat secara kaku dengan pola Singleton . Inisialisasi malas juga digunakan dalam pola desain kreasi lainnya, seperti Proxy dan Metode Pabrik, tetapi ini juga cerita lain =)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION