Apakah praktik yang baik / buruk / dapat diterima untuk meneruskan objek saat ini dalam pemanggilan metode. Seperti dalam:
public class Bar{
public Bar(){}
public void foo(Baz baz){
// modify some values of baz
}
}
public class Baz{
//constructor omitted
public void method(){
Bar bar = new Bar();
bar.foo(this);
}
}
Secara khusus, apakah saluran tersebut bar.foo(this)
dapat diterima?
Jawaban:
Tidak ada alasan untuk tidak menggunakannya,
this
ini adalah contoh saat ini dan sangat sah untuk digunakan. Nyatanya seringkali tidak ada cara yang bersih untuk menghilangkannya.Jadi gunakan itu.
Karena sulit untuk meyakinkan itu dapat diterima tanpa contoh (jawaban negatif untuk pertanyaan seperti itu selalu lebih mudah untuk diperdebatkan), saya baru saja membuka salah satu kelas yang paling umum
java.lang
, yangString
satu, dan tentu saja saya menemukan contoh penggunaan ini, misalnyaMencari
(this
dalam proyek-proyek besar yang "diterima", Anda tidak akan gagal menemukannya.sumber
this
tidak berarti Anda menambahkan tautan dua arah, karena pewarisan dan antarmuka misalnya.Tidak ada yang salah dengan itu. Apa yang BUKAN praktik yang baik adalah melakukan hal yang sama di dalam konstruktor, karena Anda akan memberikan referensi ke objek yang belum sepenuhnya diinisialisasi.
Ada semacam posting serupa di sini: Java membocorkan ini di konstruktor di mana mereka memberikan penjelasan mengapa yang terakhir adalah praktik yang buruk.
sumber
Car
konstruktor dapat membuatWheel
instance,Car
tanpa yangWheel
diinisialisasi tidak lengkap, sedangkanWheel
tanpa korespondensiCar
juga akan tidak diinisialisasi secara lengkap. Dalam hal ini, mungkin dapat diterima di konstruktor Mobil untuk meneruskanthis
ke konstruktor Roda. Alternatif lain adalah membuat Mobil dan Roda memiliki konstruktor pribadi dan menggunakan fungsi pabrik yang membangun Mobil, Roda, dan memasang Roda pada Mobil; tetapi apakah itu harus menjadi metode statis di Mobil atau metode statis di Wheel?CarFactoryWheelInstallerProxy
yang menginstal roda untuk Anda.Wheel
sepenuhnya di bawahCar
, dan IMO seharusnya tidak tahuCar
sama sekali.this
dari dalam konstruktor adalah jikathis
diteruskan ke metode atau konteks dari mana referensi objek yang belum sepenuhnya dibuat dipublikasikan ke klien yang tidak tepercaya atau tidak dikenal (atau kode klien yang mengasumsikan memiliki pandangan ke objek yang sepenuhnya dibangun). Meneruskanthis
dari konstruktor ke metode paket-privat yang melakukan inisialisasi umum, menurut pendapat saya, tidak hanya dapat diterima tetapi juga diinginkan.Ya , tetapi Anda harus berhati-hati tentang dua hal
sumber
this
. Melakukan itu tidak mungkin dilakukan jika objek belum dialokasikan.Itu sangat normal dan bisa diterima.
sumber
ini singkatan dari objek saat ini. Apa yang Anda lakukan secara sistematis benar tetapi saya tidak melihat kebutuhan ini jika Anda memanggil metode di kelas yang sama.
sumber
this
antara dua kelas. Jadi, tidak perlu menambah kerumitan ekstra.Itu adalah praktik yang buruk untuk meneruskan objek saat ini dalam pemanggilan metode jika ada alternatif yang kurang rumit untuk mencapai perilaku yang sama.
Menurut definisi, asosiasi dua arah dibuat segera
this
diteruskan dari satu objek ke objek lainnya.Mengutip Refactoring, oleh Martin Fowler:
Jadi, secara teoritis, kita harus mendengar lonceng peringatan ketika kita merasa perlu untuk lewat
this
dan berusaha keras untuk memikirkan cara lain untuk menyelesaikan masalah yang ada. Tentu saja, ada kalanya, pada akhirnya, tindakan itu masuk akal.Juga sering kali perlu merusak desain Anda untuk sementara, melakukan 'praktik buruk', selama refactoring kode jangka panjang Anda untuk perbaikan keseluruhan. (Satu langkah mundur, dua langkah maju).
Dalam praktiknya, saya menemukan kode saya telah meningkat secara besar-besaran dengan menghindari tautan dua arah seperti wabah.
sumber
this
disahkan.equals
adalah Objek. Ini sangat umum: metode penerima mendefinisikan argumennya sebagai kelas yang lebih umum atau sebagai antarmuka. Salah satu alasan pola seperti itu digunakan di java adalah untuk menghindari ketergantungan yang tidak diinginkan. Sebelum melangkah lebih jauh, saya sarankan Anda melihat banyak kejadian lewatthis
sebagai argumen di perpustakaan java terhormat.this
kode saya, jika memungkinkan. Saya akan merekomendasikan orang lain untuk melakukannya.Iya. Anda dapat menggunakannya.Ini hanya umum dalam pemrograman untuk
this
lulus.Tetapi ada pro dan kontra tentang penggunaan itu.Meski begitu tidak berbahaya untuk melakukannya.sumber
Hanya untuk menambahkan satu contoh lagi dimana passing
this
benar dan mengikuti desain yang baik: Pola pengunjung . Dalam pola desain Pengunjung, metodeaccept(Visitor v)
biasanya diimplementasikan dengan cara yang hanya dipanggilv.visit(this)
.sumber
Dapat diterima
Cuplikan dari dokumen Oracle JAVA:
sumber
this
sebagai parameter dapat diterima ? ".this.some_variable
untuk merujuk ke variabel kelas daripada ke variabel lokal. Ini tidak ada hubungannya dengan melewatkanthis
sebagai parameter.Segala sesuatu di java diteruskan oleh nilai. Tapi objek TIDAK PERNAH diteruskan ke metode!
Ketika java mengoper objek ke metode, pertama-tama java membuat salinan referensi ke objek tersebut, bukan salinan objek itu sendiri. Oleh karena itu, metode ini sangat cocok digunakan di java. Dan penggunaan yang paling sering diikuti.
sumber
this
referensi ke tipe primitif, dan oleh karena itu saya pikir "info selengkapnya" Anda menimbulkan kebingungan.