@ yegor256 Saya memahami analogi anjing & bola Anda dan saya bahkan mendukungnya, tetapi bagaimana dengan objek "organisme hidup" yang sesekali menyimpan nilai primitif misalnya ID? Bagaimana jika Anda ingin melangkah lebih jauh dari tugas sederhana tetapi tidak ingin menulis kelas baru hanya untuk menangani nilai primitif?
Jacksonkr
Jawaban:
127
Tutorial tidak benar-benar diperlukan untuk ini. Baca tentang enkapsulasi
privateString myField;//"private" means access to this is restrictedpublicString getMyField(){//include validation, logic, logging or whatever you like herereturnthis.myField;}publicvoid setMyField(String value){//include more logicthis.myField = value;}
jadi pengambil hanyalah metode mendapatkan bidang privat dan penyetel menyetel bidang baru. terima kasih atas penjelasan yang sangat baik dengan kode
ajsie
1
bisakah Anda memberikan parameter ke getter?
ajsie
2
noname: Tidak dan tidak. Getter adalah cara untuk mendapatkan nilai tetapi TIDAK mengekspos nilai yang terkandung dalam sebuah field, yaitu jika Anda memanggilnya someObj.getTime().setHour(5)tidak akan mempengaruhi someObjkeadaan internal. Juga setter dan getter (accessor dan mutators dengan nama yang lebih bagus) memiliki tanda tangan metode yang sangat ketat yang berarti bahwa getter tidak memiliki parameter apa pun. Metode secara umum seharusnya hanya melakukan satu hal.
Esko
4
@noname: Ketika hal-hal sederhana diberi nama kompleks / besar / abstrak, Anda memiliki apa yang disebut "pola desain" .... Dan ini adalah contoh Pola Penjelasan Konsep Rekursif yang baru saya temukan ;-)
namespaceform
3
@qed: Kata thiskunci bersifat opsional kecuali jika ada konflik dengan sesuatu yang memiliki cakupan yang lebih spesifik. Dalam contoh yang Anda berikan, penyetel yang dibuat akan memiliki satu parameter yang namanya cocok dengan nama bidang, oleh karena itu this.fieldName = fieldName, digunakan untuk membedakan bahwa bidang sedang ditetapkan daripada parameter yang ditetapkan ke dirinya sendiri seperti yang fieldName = fieldnameakan dicapai. Tidak ada konflik seperti itu di pengambil.
Paul Creasey
39
Di Java getter dan setter adalah fungsi yang benar-benar biasa. Satu-satunya hal yang membuat mereka getter atau setter adalah konvensi. Pengambil untuk foo disebut getFoo dan penyetel disebut setFoo. Dalam kasus boolean, pengambil disebut isFoo. Mereka juga harus memiliki deklarasi spesifik seperti yang ditunjukkan dalam contoh getter dan setter untuk 'name' ini:
Alasan menggunakan getter dan setter alih-alih menjadikan anggota Anda publik adalah karena hal itu memungkinkan untuk mengubah implementasi tanpa mengubah antarmuka. Selain itu, banyak alat dan perangkat yang menggunakan refleksi untuk memeriksa objek hanya menerima objek yang memiliki getter dan setter. JavaBeans misalnya harus memiliki getter dan setter serta beberapa persyaratan lainnya.
Bukankah seharusnya para konstruktor itu memiliki 'void'?
Jason Hartley
Kekosongan sebenarnya diperlukan di sini. Jika Anda tidak memilikinya, Anda mendapatkan:error: invalid method declaration; return type required
Dan
3
Void tidak diperlukan di sini
Shashi Kiran
2
@JasonHartley: Konstruktor tidak memiliki tipe kembalian.
wassimans
@ Mark Byers Jadi, konstruktor digunakan untuk menginisialisasi instance, dan setter digunakan untuk mengubah atribut yang diberikan. Apakah ini benar?
carloswm85
12
classClock{String time;void setTime (String t){
time = t;}String getTime(){return time;}}classClockTestDrive{publicstaticvoid main (String[] args){Clock c =newClock;
c.setTime("12345")String tod = c.getTime();System.out.println(time:"+ tod);}}
Saat Anda menjalankan program, program dimulai di induk,
Meskipun metode pengambil / penyetel adalah hal yang umum di Java, metode ini tidak berorientasi objek (OO). Faktanya, mereka dapat merusak pemeliharaan kode Anda. Selain itu, kehadiran berbagai metode pengambil dan penyetel merupakan tanda bahaya bahwa program tersebut belum tentu dirancang dengan baik dari perspektif OO.
Artikel ini menjelaskan mengapa Anda tidak boleh menggunakan getter dan setter (dan kapan Anda bisa menggunakannya) dan menyarankan metodologi desain yang akan membantu Anda keluar dari mentalitas pengambil / penyetel.
1. Pengambil / penyetel terbaik adalah yang cerdas.
Berikut contoh javascript dari mozilla:
var o ={ a:0}// `o` is now a basic objectObject.defineProperty(o,"b",{
get: function (){returnthis.a +1;}});
console.log(o.b)// Runs the getter, which yields a + 1 (which is 1)
Saya telah menggunakan ini BANYAK karena mereka luar biasa . Saya akan menggunakannya ketika mulai menyukai coding + animasi saya. Misalnya, buat penyetel yang berurusan dengan Numberyang menampilkan nomor itu di halaman web Anda. Ketika penyetel digunakan, ia menganimasikan nomor lama ke nomor baru menggunakan tweener . Jika angka awal adalah 0 dan Anda mengaturnya menjadi 10 maka Anda akan melihat angka-angka berubah dengan cepat dari 0 menjadi 10, katakanlah, setengah detik. Pengguna menyukai barang ini dan menyenangkan untuk dibuat.
2. Getters / setter di php
Contoh dari sof
<?php
classMyClass{private $firstField;private $secondField;public function __get($property){if(property_exists($this, $property)){return $this->$property;}}public function __set($property, $value){if(property_exists($this, $property)){
$this->$property = $value;}return $this;}}?>
Berikut adalah contoh untuk menjelaskan cara paling sederhana menggunakan getter dan setter di java. Seseorang dapat melakukan ini dengan cara yang lebih mudah tetapi pengambil dan penyetel memiliki sesuatu yang istimewa yaitu saat menggunakan anggota pribadi kelas induk di kelas anak dalam warisan. Anda dapat membuatnya mungkin dengan menggunakan pengambil dan penyetel.
package stackoverflow;publicclassStackoverFlow{privateint x;publicint getX(){return x;}publicint setX(int x){returnthis.x = x;}publicvoid showX(){System.out.println("value of x "+x);}publicstaticvoid main(String[] args){StackoverFlow sto =newStackoverFlow();
sto.setX(10);
sto.getX();
sto.showX();}}
Saya tidak akan meremehkan Anda (tidak sepadan dengan usahanya). Perlu diketahui bahwa (1) Anda telah menjawab pertanyaan Java , di mana bahasa program seharusnya dalam Java. (2) Jika Anda ingin memposting, pastikan tata letaknya dilakukan dengan benar. (3) Penggunaan enkapsulasi (pengambil (atau pengakses) dan penyetel (atau mutator)) Anda tidak benar. Silakan lihat apa arti enkapsulasi ... (Periksa jawaban yang dipilih)
KarelG
1
@KarelG maaf saya tidak membaca tag. saya memperbaruinya ke java. terima kasih telah menyadari saya.
Jawaban:
Tutorial tidak benar-benar diperlukan untuk ini. Baca tentang enkapsulasi
sumber
someObj.getTime().setHour(5)
tidak akan mempengaruhisomeObj
keadaan internal. Juga setter dan getter (accessor dan mutators dengan nama yang lebih bagus) memiliki tanda tangan metode yang sangat ketat yang berarti bahwa getter tidak memiliki parameter apa pun. Metode secara umum seharusnya hanya melakukan satu hal.this
kunci bersifat opsional kecuali jika ada konflik dengan sesuatu yang memiliki cakupan yang lebih spesifik. Dalam contoh yang Anda berikan, penyetel yang dibuat akan memiliki satu parameter yang namanya cocok dengan nama bidang, oleh karena ituthis.fieldName = fieldName
, digunakan untuk membedakan bahwa bidang sedang ditetapkan daripada parameter yang ditetapkan ke dirinya sendiri seperti yangfieldName = fieldname
akan dicapai. Tidak ada konflik seperti itu di pengambil.Di Java getter dan setter adalah fungsi yang benar-benar biasa. Satu-satunya hal yang membuat mereka getter atau setter adalah konvensi. Pengambil untuk foo disebut getFoo dan penyetel disebut setFoo. Dalam kasus boolean, pengambil disebut isFoo. Mereka juga harus memiliki deklarasi spesifik seperti yang ditunjukkan dalam contoh getter dan setter untuk 'name' ini:
Alasan menggunakan getter dan setter alih-alih menjadikan anggota Anda publik adalah karena hal itu memungkinkan untuk mengubah implementasi tanpa mengubah antarmuka. Selain itu, banyak alat dan perangkat yang menggunakan refleksi untuk memeriksa objek hanya menerima objek yang memiliki getter dan setter. JavaBeans misalnya harus memiliki getter dan setter serta beberapa persyaratan lainnya.
sumber
error: invalid method declaration; return type required
Saat Anda menjalankan program, program dimulai di induk,
setTime()
dipanggil oleh objek ctime
disetel ke nilai yang dilewatigetTime()
disebut dengan objek ctod
dantod
dicetaksumber
Anda mungkin juga ingin membaca " Mengapa metode pengambil dan penyetel itu jahat ":
sumber
1. Pengambil / penyetel terbaik adalah yang cerdas.
Berikut contoh javascript dari mozilla:
Saya telah menggunakan ini BANYAK karena mereka luar biasa . Saya akan menggunakannya ketika mulai menyukai coding + animasi saya. Misalnya, buat penyetel yang berurusan dengan
Number
yang menampilkan nomor itu di halaman web Anda. Ketika penyetel digunakan, ia menganimasikan nomor lama ke nomor baru menggunakan tweener . Jika angka awal adalah 0 dan Anda mengaturnya menjadi 10 maka Anda akan melihat angka-angka berubah dengan cepat dari 0 menjadi 10, katakanlah, setengah detik. Pengguna menyukai barang ini dan menyenangkan untuk dibuat.2. Getters / setter di php
Contoh dari sof
kutipan:
sumber
Berikut adalah contoh untuk menjelaskan cara paling sederhana menggunakan getter dan setter di java. Seseorang dapat melakukan ini dengan cara yang lebih mudah tetapi pengambil dan penyetel memiliki sesuatu yang istimewa yaitu saat menggunakan anggota pribadi kelas induk di kelas anak dalam warisan. Anda dapat membuatnya mungkin dengan menggunakan pengambil dan penyetel.
sumber