Pertanyaan Kapan menggunakan Constructor dan kapan menggunakan metode getInstance () (metode pabrik statis)?


  1. Kapan dan bagaimana kita harus menggunakan Pembuat

    Foo bar = new Foo();
    
  2. Dan Kapan dan bagaimana kita harus menggunakan getInstance () (metode pabrik statis)

    Foo bar = Foo.getInstance();
    

Apa perbedaan antara keduanya, saya selalu menggunakan cara 1 tetapi kapan menggunakan cara ke-2?


76
2017-07-02 22:03


asal


Jawaban:


Semua orang tampaknya fokus pada lajang sementara saya berpikir bahwa pertanyaannya sebenarnya tentang metode konstruktor vs pabrik statis.

Ini sebenarnya Butir 1: Pertimbangkan metode pabrik statis daripada konstruktor dari Java yang efektif oleh Joshua Bloch:

Butir 1: Pertimbangkan metode pabrik statis daripada konstruktor

Cara normal untuk kelas untuk memungkinkan   klien untuk mendapatkan turunannya sendiri   adalah menyediakan konstruktor publik.   Ada teknik lain yang seharusnya   menjadi bagian dari setiap programmer   toolkit. Kelas dapat memberikan publik    metode pabrik statis, yang merupakan metode statis yang mengembalikan sebuah   contoh kelas. Ini sederhana   contoh dari Boolean (kotak itu   kelas primitif untuk tipe primitif    boolean). Metode ini menerjemahkan a   nilai primitif boolean menjadi    Boolean referensi objek:

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}

Perhatikan bahwa metode pabrik statis   tidak sama dengan Metode Pabrik   pola dari Pola desain   [Gamma95, hal. 107]. Pabrik statis   metode yang dijelaskan dalam item ini tidak memiliki   setara langsung dalam Desain   Pola.

Kelas dapat menyediakan kliennya   metode pabrik statis sebagai ganti, atau   selain itu, konstruktor.   Menyediakan metode pabrik statis   bukannya konstruktor publik   baik kelebihan maupun kekurangannya.

Keuntungan (mengutip buku):

  • Salah satu keuntungan dari metode pabrik statis adalah bahwa, tidak seperti konstruktor, mereka memiliki nama.
  • Keuntungan kedua dari metode pabrik statis adalah bahwa, tidak seperti konstruktor, mereka tidak diharuskan untuk membuat objek baru setiap kali mereka dipanggil.
  • Keuntungan ketiga metode pabrik statis adalah bahwa, tidak seperti konstruktor, mereka dapat mengembalikan suatu objek dari subtipe jenis kembalinya.
  • Keuntungan keempat metode pabrik statis adalah bahwa mereka mengurangi verbositas membuat contoh jenis parameter.

Kekurangan (masih mengutip buku):

  • Kerugian utama hanya menyediakan metode pabrik statis adalah itu kelas tanpa konstruktor publik atau yang dilindungi tidak dapat disubklasifikasikan.
  • Kerugian kedua metode pabrik statis adalah bahwa mereka tidak mudah dibedakan dari metode statis lainnya.

87
2017-07-02 23:16



Anda punya dua pertanyaan: kapan saya harus panggilan Sebuah getInstance() metode, dan kapan saya harus membuat satu?

Jika Anda memutuskan apakah akan menelepon Sebuah getInstance() metode, itu mudah. Anda hanya perlu membaca dokumentasi kelas untuk mencari tahu kapan Anda harus menyebutnya. Sebagai contoh, NumberFormat menyediakan konstruktor dan Sebuah getInstance() metode; itu getInstance() metode akan memberi Anda dilokalkan NumberFormat. Untuk Calendar, di sisi lain, konstruktor dilindungi. Kamu memiliki memanggil getInstance() untuk mendapatkannya.

Jika Anda memutuskan apakah akan membuat Sebuah getInstance() metode, Anda perlu memutuskan apa yang ingin Anda capai. Entah kamu tidak ingin orang memanggil konstruktor Anda (Anda membuat a tunggal atau a pabrik), atau Anda tidak keberatan (seperti dalam NumberFormat di atas, di mana mereka melakukan inisialisasi beberapa objek untuk kenyamanan si penelepon).


Singkat cerita? Jangan khawatir tentang membuat getInstance() metode dalam kode Anda sendiri. Jika waktu muncul ketika mereka akan berguna, Anda akan tahu. Dan secara umum, jika Anda bisa sebut konstruktor kelas, Anda mungkin seharusnya melakukan itu, bahkan jika kelas menyediakan getInstance() metode.


7
2017-07-02 22:08



Penggunaan metode getInstance:

Tetapi sebagian besar waktu objek Anda akan menjadi sederhana POJO dan penggunaan konstruktor publik adalah solusi yang paling praktis dan jelas.

U1: DapatkanInstansi Dari Kelas Lain

Untuk mengembalikan instance dari kelas yang berbeda:

public class FooFactory {
    public static Foo getInstance() {
        return new Foo();
    }
}

NumberFormat.getInstance metode melakukan ini karena mereka mengembalikan instance DecimalFormat.

U2: Masalah Singleton

Pola tunggal membatasi banyak manfaat dari pemrograman berorientasi objek. Singleton umumnya memiliki konstruktor pribadi, oleh karena itu Anda tidak dapat memperpanjangnya. Karena Anda akan mengaksesnya melalui metode getInstance dan tidak mereferensikan antarmuka apa pun, Anda tidak akan dapat menukarnya untuk implementasi lain.


7
2017-07-02 22:14



Jika Anda bisa menggunakan keduanya maka itu terdengar seperti diimplementasikan dengan buruk pola tunggal.

Gunakan opsi kedua jika Anda bermaksud hanya memiliki satu instance dari kelas di sistem Anda dan buatlah konstruktor itu sendiri.

Gunakan yang pertama untuk memungkinkan membangun beberapa objek dari kelas.

TETAPI jangan memberikan kelas Anda kedua kemungkinan itu.

Berhati-hatilah untuk tidak menggunakan huruf lajang secara berlebihan, gunakan hanya jika benar-benar hanya satu contoh yang ada di sistem jika tidak, Anda akan membatasi kemungkinan penggunaan kembali kelas Anda dalam proyek lain. Kedengarannya menarik untuk dapat memanggil getInstance dari mana-mana dalam proyek Anda tetapi itu membuat tidak jelas siapa yang benar-benar memiliki contoh itu: tidak ada dan / atau semua. Jika Anda memiliki banyak lajang dalam proyek, Anda dapat bertaruh bahwa sistem tersebut dirancang dengan buruk (biasanya). Singletons harus digunakan dengan hati-hati, saran yang sama dari pada variabel global berlaku.


6
2017-07-02 22:04



Satu kasus di mana saya selalu lebih suka pabrik statis daripada konstruktor biasa adalah ketika saya tahu konstruksi objek akan melambat. Saya melakukan inisialisasi sederhana pada konstruktor, tetapi jika saya perlu membuat sesuatu yang berat saya akan menggunakan metode statis dan mendokumentasikan perilaku.


1
2018-05-11 09:43



Lelaki yang jahat. Masalah yang pernah saya saksikan di sekitarnya bukan tentang penggunaan kembali atau perluasan sistem (meskipun saya bisa melihat bagaimana itu bisa terjadi), lebih lagi sehingga saya tidak dapat menghitung berapa kali saya melihat bug yang tidak jelas dalam sistem yang muncul dari lajang.

Jika Anda perlu menggunakan tunggal, pastikan ruang lingkupnya sangat sempit, yaitu dengan bijaksana membatasi jumlah objek lain di sistem Anda yang mengetahuinya.


0
2017-07-02 22:20