Bagaimana cara kerja pengambil dan penyetel?

107

Saya dari dunia php. Bisakah Anda menjelaskan apa itu getter dan setter dan dapat memberi Anda beberapa contoh?

ajsie
sumber
@ 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

private String myField; //"private" means access to this is restricted

public String getMyField()
{
     //include validation, logic, logging or whatever you like here
    return this.myField;
}
public void setMyField(String value)
{
     //include more logic
     this.myField = value;
}
Paul Creasey
sumber
11
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:

class Dummy
{
    private String name;

    public Dummy() {}

    public Dummy(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

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.

Mark Byers
sumber
9
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
class Clock {  
        String time;  

        void setTime (String t) {  
           time = t;  
        }  

        String getTime() {  
           return time;  
        }  
}  


class ClockTestDrive {  
   public static void main (String [] args) {  
   Clock c = new Clock;  

   c.setTime("12345")  
   String tod = c.getTime();  
   System.out.println(time: " + tod);  
 }
}  

Saat Anda menjalankan program, program dimulai di induk,

  1. objek c dibuat
  2. fungsi setTime()dipanggil oleh objek c
  3. variabel timedisetel ke nilai yang dilewati
  4. fungsi getTime()disebut dengan objek c
  5. waktunya dikembalikan
  6. Ini akan berlalu toddan toddicetak
pengguna3137648
sumber
10

Anda mungkin juga ingin membaca " Mengapa metode pengambil dan penyetel itu jahat ":

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.

superfav
sumber
3

1. Pengambil / penyetel terbaik adalah yang cerdas.

Berikut contoh javascript dari mozilla:

var o = { a:0 } // `o` is now a basic object

Object.defineProperty(o, "b", { 
    get: function () { 
        return this.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
class MyClass {
  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;
  }
}
?>

kutipan:

Jacksonkr
sumber
2

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;

    public class StackoverFlow 

    {

        private int x;

        public int getX()
        {
            return x;
        }

        public int setX(int x)
        {
          return  this.x = x;
        }
         public void showX()
         {
             System.out.println("value of x  "+x);
         }


        public static void main(String[] args) {

            StackoverFlow sto = new StackoverFlow();
            sto.setX(10);
            sto.getX();
            sto.showX();
        }

    }
Bashir ahmad
sumber
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.
Bashir ahmad