Как работают геттеры и сеттеры? - PullRequest
104 голосов
/ 10 января 2010

Я из мира php. Не могли бы вы объяснить, что такое геттеры и сеттеры, и могли бы привести несколько примеров?

Ответы [ 6 ]

125 голосов
/ 10 января 2010

Учебник на самом деле не требуется для этого. Читайте о инкапсуляция

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;
}
38 голосов
/ 10 января 2010

В Java геттеры и сеттеры являются совершенно обычными функциями. Единственное, что делает их добытчиками или установщиками - это условность. Получатель для foo называется getFoo, а установщик называется setFoo. В случае логического значения метод получения называется isFoo. У них также должно быть определенное объявление, как показано в этом примере метода получения и установки для «имени»:

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

Причина использования геттеров и сеттеров вместо того, чтобы делать ваши члены публичными, заключается в том, что это позволяет изменять реализацию без изменения интерфейса. Кроме того, многие инструменты и наборы инструментов, которые используют отражение для проверки объектов, принимают только те объекты, которые имеют геттеры и сеттеры. JavaBeans , например, должен иметь геттеры и сеттеры, а также некоторые другие требования.

12 голосов
/ 25 января 2014
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);  
 }
}  

Когда вы запускаете программу, программа запускается в сети,

  1. объект c создан
  2. функция setTime() вызывается объектом c
  3. переменная time установлена ​​в значение, переданное
  4. функция getTime() вызывается объектом c
  5. время возвращается
  6. Он перейдет к tod и tod распечатается
8 голосов
/ 10 января 2010

Вы также можете прочитать " Почему методы получения и установки являются злыми ":

Хотя методы получения / установки обычно используются в Java, они не особенно объектно-ориентированы (ОО). Фактически, они могут повредить удобству сопровождения вашего кода. Более того, наличие многочисленных методов получения и установки - это красный признак того, что программа не обязательно хорошо разработана с точки зрения ОО.

Эта статья объясняет, почему вы не должны использовать геттеры и сеттеры (и когда вы можете их использовать), и предлагает методологию проектирования, которая поможет вам выйти из менталитета геттер / сеттер.

2 голосов
/ 06 января 2016

1. Лучшие добытчики / сеттеры умны.

Вот пример JavaScript из 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)

Я использовал эти МНОГО, потому что они потрясающие . Я бы использовал его, когда мне стало интересно с моим кодированием + анимацией. Например, создайте сеттер, который имеет дело с Number, который отображает этот номер на вашей веб-странице. Когда используется сеттер, он анимирует старый номер на новый, используя tweener . Если исходное число равно 0, а вы установите его на 10, то вы увидите, что числа быстро меняются от 0 до 10, скажем, на полсекунды. Пользователи любят этот материал, и создавать его весело.

2. Геттеры / сеттеры в php

Пример из соф

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

citings:

1 голос
/ 18 мая 2017

Вот пример, объясняющий наиболее простой способ использования getter и setter в java. Можно сделать это более простым способом, но у getter и setter есть что-то особенное, например, при использовании закрытого члена родительского класса в дочернем классе в наследовании. Вы можете сделать это с помощью getter и setter.

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

    }
...