Alıcılar ve ayarlayıcılar nasıl çalışır?


107

Ben php dünyasındanım. Alıcıların ve ayarlayıcıların ne olduğunu açıklayabilir misiniz ve size bazı örnekler verebilir misiniz?


@ yegor256 Köpek ve top benzetmenizi anlıyorum ve hatta destekliyorum, ama ya "canlı organizma" nesnesi ara sıra ilkel değeri depoladığında, örneğin bir kimlik? Ya basit bir atamanın ötesine geçmek istiyor ama sadece ilkel değerleri işlemek için yeni bir sınıf yazmak istemiyorsanız?
Jacksonkr

Yanıtlar:


127

Bunun için öğretici gerçekten gerekli değildir. Kapsülleme hakkında bilgi edinin

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;
}

11
bu nedenle alıcı, özel bir alan elde etme yöntemidir ve ayarlayıcı, yeni bir alan belirler. kodla mükemmel açıklama için teşekkürler
ajsie

1
alıcıya bir parametre iletebilir misin?
ajsie

2
noname: Hayır ve hayır. Getter, bir değer elde etmenin bir yoludur, ancak bir alanda bulunan değeri açığa çıkarmaz, yani eğer çağırırsanız someObj.getTime().setHour(5), someObjiç durumunu etkilememelidir . Ayrıca ayarlayıcılar ve alıcılar (meraklılarının adıyla erişimciler ve mutatörler) çok katı bir yöntem imzasına sahiptir, yani alıcı herhangi bir parametreye sahip değildir. Genel olarak yöntemler zaten tek bir şey yapmalıdır.
Esko

4
@noname: Basit şeylere karmaşık / büyük / soyut isimler verildiğinde, "tasarım kalıbı" denen bir şeye sahip olursunuz ... Ve bu, az önce icat ettiğim Özyinelemeli Kavram Açıklama Modelinin bir örneğidir ;-)
ad alanı

3
@qed: thisDaha spesifik kapsamı olan bir şeyle çelişki olmadığı sürece anahtar kelime isteğe bağlıdır. Verdiğiniz örnekte, yaratılan ayarlayıcı, adı alan adıyla eşleşen tek bir parametreye sahip olacaktır, bu nedenle this.fieldName = fieldName, fieldName = fieldnameelde edileceği gibi parametrenin kendisine atanmasından ziyade alanın atandığını ayırt etmek için kullanılır . Alıcıda böyle bir çatışma yoktur.
Paul Creasey

39

Java'da alıcılar ve ayarlayıcılar tamamen sıradan işlevlerdir. Onları alıcı veya ayarlayıcı yapan tek şey gelenektir. Foo için alıcıya getFoo ve ayarlayıcıya setFoo denir. Bir boole durumunda alıcıya isFoo denir. Ayrıca, 'ad' için bir alıcı ve ayarlayıcı örneğinde gösterildiği gibi belirli bir bildirime sahip olmaları gerekir:

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;
    }
}

Üyelerinizi herkese açık hale getirmek yerine alıcılar ve ayarlayıcılar kullanmanın nedeni, arayüzü değiştirmeden uygulamayı değiştirmeyi mümkün kılmasıdır. Ayrıca, nesneleri incelemek için yansımayı kullanan birçok araç ve araç takımı, yalnızca alıcıları ve ayarlayıcıları olan nesneleri kabul eder. Örneğin JavaBeans , alıcılara ve ayarlayıcılara ve diğer bazı gereksinimlere sahip olmalıdır.


9
Bu kurucuların 'boşluğu' olmamalı mı?
Jason Hartley

Aslında burada boşluk gereklidir. Elinizde yoksa:error: invalid method declaration; return type required
Dan

3
Burada void gerekli değil
Shashi Kiran

2
@JasonHartley: Bir kurucunun dönüş türü yoktur.
wassimans

@Mark Byers Yani, yapıcı, örneği başlatmak için kullanılır ve ayarlayıcı, verilen herhangi bir niteliği değiştirmek için kullanılır. Bu doğru mu?
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);  
 }
}  

Programı çalıştırdığınızda program ana şebekede başlar,

  1. c nesnesi oluşturuldu
  2. işlev setTime()c nesnesi tarafından çağrılır
  3. değişken time, geçen değere ayarlanır
  4. işlev getTime()c nesnesi tarafından çağrılır
  5. zaman geri döndü
  6. Geçecek todve todyazdırılacak

10

Ayrıca " Alıcı ve ayarlayıcı yöntemleri neden kötüdür " adlı makaleyi de okumak isteyebilirsiniz :

Alıcı / ayarlayıcı yöntemleri Java'da yaygın olsa da, özellikle nesne yönelimli (OO) değildirler. Aslında, kodunuzun bakımına zarar verebilirler. Dahası, çok sayıda alıcı ve ayarlayıcı yönteminin varlığı, programın OO perspektifinden mutlaka iyi tasarlanmadığı konusunda kırmızı bir bayraktır.

Bu makale alıcıları ve ayarlayıcıları neden kullanmamanız gerektiğini (ve bunları ne zaman kullanabileceğinizi) açıklar ve alıcı / ayarlayıcı zihniyetinden çıkmanıza yardımcı olacak bir tasarım metodolojisi önerir.


3

1. En iyi alıcılar / ayarlayıcılar akıllıdır.

Mozilla'dan bir javascript örneği:

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)

Bunları çok kullandım çünkü harikalar . Kodlama + animasyonumdan hoşlanırken kullanırdım. Örneğin, Numberweb sayfanızda o numarayı görüntüleyen bir ayarlayıcı yapın. Ayarlayıcı kullanıldığında, bir ara doldurucu kullanarak eski numarayı yeni numaraya hareketlendirir . İlk sayı 0 ise ve onu 10 olarak ayarlarsanız, sayıların hızlıca 0'dan 10'a, diyelim ki yarım saniye arasında değiştiğini görürsünüz. Kullanıcılar bu şeyleri sever ve yaratmak eğlencelidir.

2. php'de oluşturucular / ayarlayıcılar

Sof'dan örnek

<?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;
  }
}
?>

alıntılar:


2

Getter ve setter'ı java'da kullanmanın en basit yolunu açıklamak için bir örnek. Bunu daha basit bir şekilde yapabilirsiniz, ancak alıcı ve ayarlayıcı, kalıtımda alt sınıfta ebeveyn sınıfının özel üyesini kullanırken olan özel bir şeye sahiptir. Alıcı ve ayarlayıcı kullanarak bunu mümkün kılabilirsiniz.

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();
        }

    }

Size olumsuz oy vermeyeceğim (çabaya değmez). Lütfen (1) Program dilinin Java'da olması gereken bir Java sorusunu yanıtladığınızı unutmayın . (2) Göndermek istiyorsanız, düzenin doğru yapıldığından emin olun. (3) Kapsülleme (alıcı (veya erişimci) ve ayarlayıcılar (veya mutatörler)) kullanımınız yanlıştır. Lütfen kapsüllemenin ne anlama geldiğine bakın ... (
Oylanan

1
@KarelG üzgünüm etiketleri okumadım. Java'ya güncelledim. beni fark ettiğin için teşekkürler.
Bashir Ahmad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.