Я из мира php. Не могли бы вы объяснить, что такое геттеры и сеттеры, и привести несколько примеров?
Как работают геттеры и сеттеры?
- @ yegor256 Я понимаю вашу аналогию с собакой и мячом и даже поддерживаю ее, но как насчет случая, когда объект живого организма хранит случайные примитивные значения, например идентификатор? Что, если вы хотите выйти за рамки простого присваивания, но не хотите писать новый класс только для обработки примитивных значений? 06.01.2016
Ответы:
Учебник для этого не требуется. Прочтите об инкапсуляции
private String myField; //"private" means access to this is restricted to the class.
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;
}
В Java геттеры и сеттеры - это совершенно обычные функции. Единственное, что делает их геттерами или сеттерами, - это условность. Метод получения для foo называется getFoo, а метод установки - setFoo. В случае логического значения метод получения называется isFoo. У них также должно быть определенное объявление, как показано в этом примере получателя и сеттера для 'name':
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 должны иметь геттеры и сеттеры, а также некоторые другие требования.
error: invalid method declaration; return type required
18.08.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);
}
}
При запуске программы программа запускается от сети,
- объект c создан
- функция
setTime()
вызывается объектом c - переменная
time
устанавливается на значение, переданное - функция
getTime()
вызывается объектом c - время возвращается
- Он перейдет к
tod
иtod
будет распечатан
Вы также можете прочитать Почему получатель и сеттер-методы - зло:
Хотя методы получения и установки являются обычным явлением в Java, они не особо объектно-ориентированы (OO). Фактически, они могут повредить ремонтопригодность вашего кода. Более того, наличие множества методов получения и установки - это красный флаг, свидетельствующий о том, что программа не обязательно хорошо спроектирована с точки зрения объектно-ориентированного программирования.
В этой статье объясняется, почему вам не следует использовать геттеры и сеттеры (и когда их можно использовать), и предлагается методология проектирования, которая поможет вам вырваться из менталитета геттеров / сеттеров.
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;
}
}
?>
цитаты:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get
- http://tweener.ivank.net/
- Получатель и установщик?
Вот пример, объясняющий самый простой способ использования методов получения и установки в java. Можно сделать это более простым способом, но у геттера и сеттера есть что-то особенное, что происходит при использовании закрытого члена родительского класса в дочернем классе в наследовании. Вы можете сделать это возможным, используя геттер и сеттер.
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();
}
}
someObj.getTime().setHour(5)
, это не должно влиять на внутреннее состояниеsomeObj
. Также сеттеры и геттеры (аксессоры и мутаторы по их более интересному имени) имеют очень строгую сигнатуру метода, означающую, что у геттера нет никаких параметров. В любом случае методы в целом должны делать только одно. 10.01.2010this
, мне интересно, почему. 03.11.2013this
необязательно, если нет конфликта с чем-то, имеющим более конкретную область действия. В приведенном вами примере созданный установщик будет иметь единственный параметр, имя которого совпадает с именем поля, поэтомуthis.fieldName = fieldName
используется, чтобы отличить, что поле назначается, а не параметр, назначаемый самому себе, посколькуfieldName = fieldname
достигнет . В геттере такого конфликта нет. 04.11.2013"get"+capitalize(<field_name-here>)+"()"
сделать ее получателем? эти имена какие-то особенные для Java? Не могли бы вы связать конкретную часть JLS, если так? 07.12.2013this.myField = "Hello"
). Как сказала накса; таким образом, это не столько настоящий геттер / сеттер, сколько соглашение. Если я прав, я мог бы просто назвать установщик updateMyField или что-то в этом роде, верно ?! 26.06.2014= my.thing
для получения илиmy.thing=
для установки. Вы утверждаете, что никому не нужен учебник, и утверждаете, что все должны знать, что это случай с Java ... но мы все обсуждаем это на этой странице? Как мы все сюда попали? 07.06.2018