2010-01-10 2 views
85

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

+5

Try, чтобы избежать их в объектно-ориентированном программировании: http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html – yegor256

+0

@ yegor256 Я понимаю, что ваша собака и мяч аналогию, и я даже поддерживаю его, но как насчет того, когда объект «живой организм» хранит случайную примитивную ценность, например идентификатор? Что делать, если вы хотите сделать шаг за пределами простого назначения, но не хотите писать новый класс только для обработки примитивных значений? – Jacksonkr

ответ

105

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

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

так что геттер - это всего лишь метод получения частного поля, а сеттер устанавливает новое поле. спасибо за отличное объяснение по коду – ajsie

+1

, можете ли вы передать параметр геттеру? – ajsie

+2

noname: Нет и нет. Getter - это способ получить значение, но не показывать значение, содержащееся в поле, то есть, если вы вызываете 'someObj.getTime(). SetHour (5)' он не должен влиять на внутреннее состояние someObj. Также сеттеры и геттеры * (аксессоры и мутаторы по имени их любителя) * имеют очень строгую подпись метода, означающую, что геттер не имеет никаких параметров. В общем, методы вообще должны делать только одно. – Esko

29

В 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, например, должны иметь геттеры и сеттеры, а также некоторые другие требования.

+9

Должны ли эти конструкторы не иметь «пустоты»? –

+0

Пустота на самом деле нужна здесь. Если у вас его нет, вы получите: 'error: invalid method declaration; return type required' – Dan

+3

Void здесь не требуется –

6

Вы также можете прочитать "Why getter and setter methods are evil":

Though getter/setter methods are commonplace in Java, they are not particularly object oriented (OO). In fact, they can damage your code's maintainability. Moreover, the presence of numerous getter and setter methods is a red flag that the program isn't necessarily well designed from an OO perspective.

This article explains why you shouldn't use getters and setters (and when you can use them) and suggests a design methodology that will help you break out of the getter/setter mentality.

11
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. объекта гр создано
  2. setTime() называется объектом с
  3. переменная time устанавливается на значение, переданное по
  4. функции getTime() вызывается объектом с
  5. время возвращается
  6. Он PASSE к tod и tod получить распечатан
2

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.Геттеры/сеттеры в РНР

Пример из 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; 
    } 
} 
?> 

citings:

0

example is here to expalin this most simple way of using getter and setter in 'java' . one can do this by more straight forward way but getter and setter has something special that is when using private member of parent class in child class in inheritance. you can make it possible through using getter and 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(); 
     } 

    } 
+0

Я не собираюсь понижать вас (не стоит усилий). Имейте в виду, что (1) у вас есть ответ на ** Java ** вопрос, где язык программирования _should_ быть на Java. (2) Если вы хотите опубликовать, убедитесь, что макет выполнен правильно. (3) Ваше использование инкапсуляции (getter (или аксессуар) и сеттеры (или мутаторы)) неверно. Посмотрите, что означает инкапсуляция ... (Отметьте проголосовавший ответ) – KarelG

+0

@KarelG жаль, что я не читал теги. Я обновил его до java.спасибо, что поняли меня. –

 Смежные вопросы

  • Нет связанных вопросов^_^