Tampaknya menjadi ortodoksi Jawa pada titik ini bahwa seseorang pada dasarnya tidak boleh menggunakan bidang publik untuk keadaan objek. (Saya tidak harus setuju, tapi itu tidak relevan dengan pertanyaan saya.) Mengingat itu, apakah benar untuk mengatakan bahwa dari tempat kita hari ini, jelas bahwa bidang publik Jawa adalah kesalahan / cacat dari desain bahasa? Atau adakah argumen rasional bahwa itu adalah bagian yang berguna dan penting dari bahasa tersebut, bahkan hari ini?
Terima kasih!
Pembaruan: Saya tahu tentang pendekatan yang lebih elegan, seperti dalam C #, Python, Groovy, dll. Saya tidak secara langsung mencari contoh-contoh itu. Saya benar-benar hanya ingin tahu apakah masih ada seseorang di dalam bunker, bergumam tentang betapa indahnya bidang publik, dan bagaimana massa semua hanyalah domba, dll.
Pembaruan 2: Bidang publik final yang jelas statis adalah cara standar untuk membuat konstanta publik. Saya merujuk lebih banyak menggunakan bidang publik untuk status objek (bahkan kondisi tidak berubah). Saya berpikir bahwa ini kelihatannya seperti cacat desain yang harus digunakan bidang publik untuk konstanta, tetapi tidak untuk negara ... aturan bahasa harus ditegakkan secara alami, dengan sintaks, bukan oleh pedoman.
Jawaban:
Saya suka mereka, selama bidangnya final dan hanya digunakan secara internal dalam aplikasi, tidak terpapar dalam API untuk aplikasi lain. Ini membuat kode Anda lebih pendek dan lebih mudah dibaca.
Anda tidak boleh mengekspos bidang publik dalam API karena dengan mengekspos bidang publik, Anda juga mengekspos implementasinya. Jika Anda mengeksposnya sebagai
getXXX()
metode, Anda bisa mengubah implementasi tanpa mengubah antarmuka API. Misalnya Anda bisa mengubah dan mendapatkan nilai dari layanan jarak jauh, tetapi aplikasi yang menggunakan API tidak perlu mengetahui hal ini.Ini adalah desain yang layak untuk
public final
bidang dalam kelas tidak berubah .Dari Java Efektif :
Lihat juga. Mengapa saya tidak harus menggunakan POJO yang tidak bisa diubah sebagai ganti JavaBeans?
sumber
getXXX()
metode, Anda bisa mengubah implementasi tanpa mengubah antarmuka API. Misalnya Anda bisa mengubah dan mendapatkan nilai dari layanan jarak jauh, tetapi aplikasi yang menggunakan API tidak perlu mengetahui hal ini.Penggunaan pasangan metode get / set adalah cacat desain sejarah yang tragis. Saya tidak bisa memikirkan bahasa lain yang mengimplementasikan properti secara verbal dan tidak efisien.
sumber
Saya pikir bidang publik baik-baik saja untuk kelas yang pada dasarnya adalah tipe nilai seperti bilangan kompleks atau titik, di mana kelas melakukan sedikit lebih banyak daripada tipe kelompok primitif bersama-sama seperti struct C-style dan mungkin mendefinisikan beberapa operator.
sumber
java.awt.Point
dan teman-teman sedikit mimpi buruk.Point
adalah tidak jelas apakah variabel tipePoint
seharusnya merangkum sebuah lokasi, atau seharusnya merangkum identitas entitas dengan lokasi yang dapat berubah. Secara konseptual, saya akan menganggap kode yang melewatiPoint
menjadi seperti kode yang melewati array.Point
dan memodifikasinya, saya harus mengharapkan objek yang dimaksud untuk memperbarui secara bersih di layar? Tidak, masalahnyaPoint
adalah ia bisa berubah. Kami memilikiString
/StringBuffer
tetapi ide itu tampaknya tidak berhasil. / Melewati array di sekitar memang memiliki masalah yang sama.Untuk mendefinisikan konstanta publik masih bermanfaat. Misalnya
Namun, tetap lebih suka enum jika memungkinkan. Misalnya
Untuk mensimulasikan kelas struct sederhana itu juga berguna. Tidak ada alasan untuk membuat pengambil dan penyetel untuk setiap bidang, saat semuanya bersifat publik.
sumber
Sebelum IDE menyebar, menjadikan semua bidang Anda publik adalah alat yang ampuh untuk membuat prototipe / bukti konsep dengan cepat.
Saat ini ada sangat sedikit alasan untuk menggunakannya, ketika Anda dapat menghasilkan pasangan pengambil / penyetel dengan klik mouse.
sumber
public final
bidang lebih mudah dibaca daripada 10getXXX()
metode.const
kata kunci akan cukup, jika tidak statis, itu adalah pelanggaran serius enkapsulasi.Ini subjektif, tetapi pendapat saya adalah bahwa seluruh gagasan publik / pribadi sudah usang dan mundur.
Dalam python tidak ada publik / pribadi; semuanya pada dasarnya bersifat publik. Belum menyebabkan banyak masalah.
Di Jawa Anda cenderung membuat getter / setters tanpa tujuan untuk setiap bidang untuk menghindari dosa menandai mereka "publik". (IMHO jika Anda menemukan diri Anda melakukan itu, Anda harus menandai mereka publik).
sumber