@ yegor256 Я понимаю вашу аналогию с собакой и мячом и даже поддерживаю ее, но как насчет случая, когда объект "живой организм" хранит случайные примитивные значения, например идентификатор? Что, если вы хотите выйти за рамки простого присваивания, но не хотите писать новый класс только для обработки примитивных значений?
Jacksonkr
Ответы:
127
Учебник для этого не требуется. Прочтите об инкапсуляции
privateString myField;//"private" means access to this is restrictedpublicString getMyField(){//include validation, logic, logging or whatever you like herereturnthis.myField;}publicvoid setMyField(String value){//include more logicthis.myField = value;}
так что геттер - это просто метод получения частного поля, а сеттер устанавливает новое поле. спасибо за отличное объяснение по коду
ajsie
1
не могли бы вы передать параметр получателю?
ajsie
2
noname: Нет и нет. Getter - это способ получить значение, но НЕ раскрывать значение, содержащееся в поле, то есть если вы someObj.getTime().setHour(5)его вызываете, это не должно влиять someObjна внутреннее состояние. Также сеттеры и геттеры (аксессоры и мутаторы по их более интересному имени) имеют очень строгую сигнатуру метода, что означает, что у геттера нет никаких параметров. В любом случае методы в целом должны делать только одно.
Esko
4
@noname: Когда простым вещам присваиваются сложные / большие / абстрактные имена, у вас есть то, что называется «шаблоном проектирования» ... И это пример шаблона объяснения рекурсивных концепций, который я только что придумал ;-)
namespaceform
3
@qed: thisключевое слово необязательно, если нет конфликта с чем-то, имеющим более конкретную область действия. В приведенном вами примере созданный установщик будет иметь один параметр, имя которого совпадает с именем поля, следовательно this.fieldName = fieldName, он используется, чтобы отличить, что поле назначается, а не параметр, назначаемый самому себе, как это fieldName = fieldnameбыло бы возможно. В геттере такого конфликта нет.
Пол Кризи,
39
В Java геттеры и сеттеры - это совершенно обычные функции. Единственное, что делает их геттерами или сеттерами, - это условность. Метод получения для foo называется getFoo, а метод установки - setFoo. В случае логического значения метод получения называется isFoo. У них также должно быть определенное объявление, как показано в этом примере получателя и сеттера для 'name':
Причина использования геттеров и сеттеров вместо того, чтобы делать ваших членов общедоступными, заключается в том, что это позволяет изменять реализацию без изменения интерфейса. Кроме того, многие инструменты и наборы инструментов, которые используют отражение для исследования объектов, принимают только те объекты, у которых есть геттеры и сеттеры. JavaBeans, например, должны иметь геттеры и сеттеры, а также некоторые другие требования.
Здесь действительно нужна пустота. Если у вас его нет, вы получите:error: invalid method declaration; return type required
Дэн
3
Пустота здесь не обязательна
Шаши Киран
2
@JasonHartley: конструктор не имеет возвращаемого типа.
вассиманы 03
@Mark Byers Итак, конструктор используется для инициализации экземпляра, а установщик используется для изменения любого заданного атрибута. Это верно?
carloswm85
12
classClock{String time;void setTime (String t){
time = t;}String getTime(){return time;}}classClockTestDrive{publicstaticvoid main (String[] args){Clock c =newClock;
c.setTime("12345")String tod = c.getTime();System.out.println(time:"+ tod);}}
При запуске программы программа запускается в сети,
Хотя методы получения и установки являются обычным явлением в Java, они не особо объектно-ориентированы (OO). Фактически, они могут повредить ремонтопригодность вашего кода. Более того, наличие множества методов получения и установки - это красный флаг, что программа не обязательно хорошо спроектирована с точки зрения объектно-ориентированного программирования.
В этой статье объясняется, почему вам не следует использовать геттеры и сеттеры (и когда их можно использовать), и предлагается методология проектирования, которая поможет вам выйти из менталитета геттеров / сеттеров.
var o ={ a:0}// `o` is now a basic objectObject.defineProperty(o,"b",{
get: function (){returnthis.a +1;}});
console.log(o.b)// Runs the getter, which yields a + 1 (which is 1)
Я использовал их МНОГО, потому что они классные . Я бы использовал его, когда начинал работать с кодированием + анимацией. Например, создайте сеттер, Numberкоторый будет отображать этот номер на вашей веб-странице. Когда используется сеттер, он анимирует старое число в новое число с помощью твинера . Если исходное число равно 0, и вы установите его на 10, вы увидите, как числа быстро меняются от 0 до 10, скажем, за полсекунды. Пользователи любят эти вещи, и их интересно создавать.
2. Геттеры / сеттеры в php
Пример от соф
<?php
classMyClass{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;}}?>
Вот пример, объясняющий самый простой способ использования методов получения и установки в java. Можно сделать это более простым способом, но у геттера и сеттера есть что-то особенное, что происходит при использовании закрытого члена родительского класса в дочернем классе в наследовании. Вы можете сделать это возможным, используя геттер и сеттер.
package stackoverflow;publicclassStackoverFlow{privateint x;publicint getX(){return x;}publicint setX(int x){returnthis.x = x;}publicvoid showX(){System.out.println("value of x "+x);}publicstaticvoid main(String[] args){StackoverFlow sto =newStackoverFlow();
sto.setX(10);
sto.getX();
sto.showX();}}
Я не собираюсь опускать вас (не стоит усилий). Имейте в виду, что (1) вы ответили на вопрос о Java , где должен быть язык программы на Java. (2) Если вы хотите опубликовать, убедитесь, что макет сделан правильно. (3) Вы неправильно используете инкапсуляцию (геттер (или аксессор) и сеттеры (или мутаторы)). Пожалуйста, посмотрите, что означает инкапсуляция ... (Проверьте проголосованный ответ)
KarelG
1
@KarelG извините, я не прочитал теги. я обновил его до java. спасибо, что поняли меня.
Ответы:
Учебник для этого не требуется. Прочтите об инкапсуляции
источник
someObj.getTime().setHour(5)
его вызываете, это не должно влиятьsomeObj
на внутреннее состояние. Также сеттеры и геттеры (аксессоры и мутаторы по их более интересному имени) имеют очень строгую сигнатуру метода, что означает, что у геттера нет никаких параметров. В любом случае методы в целом должны делать только одно.this
ключевое слово необязательно, если нет конфликта с чем-то, имеющим более конкретную область действия. В приведенном вами примере созданный установщик будет иметь один параметр, имя которого совпадает с именем поля, следовательноthis.fieldName = fieldName
, он используется, чтобы отличить, что поле назначается, а не параметр, назначаемый самому себе, как этоfieldName = fieldname
было бы возможно. В геттере такого конфликта нет.В Java геттеры и сеттеры - это совершенно обычные функции. Единственное, что делает их геттерами или сеттерами, - это условность. Метод получения для foo называется getFoo, а метод установки - setFoo. В случае логического значения метод получения называется isFoo. У них также должно быть определенное объявление, как показано в этом примере получателя и сеттера для 'name':
Причина использования геттеров и сеттеров вместо того, чтобы делать ваших членов общедоступными, заключается в том, что это позволяет изменять реализацию без изменения интерфейса. Кроме того, многие инструменты и наборы инструментов, которые используют отражение для исследования объектов, принимают только те объекты, у которых есть геттеры и сеттеры. JavaBeans, например, должны иметь геттеры и сеттеры, а также некоторые другие требования.
источник
error: invalid method declaration; return type required
При запуске программы программа запускается в сети,
setTime()
вызывается объектом ctime
устанавливается значение, переданноеgetTime()
вызывается объектом ctod
иtod
будет распечатанисточник
Вы также можете прочитать « Почему методы получения и установки - это зло »:
источник
1. Лучшие геттеры / сеттеры умны.
Вот пример javascript от Mozilla:
Я использовал их МНОГО, потому что они классные . Я бы использовал его, когда начинал работать с кодированием + анимацией. Например, создайте сеттер,
Number
который будет отображать этот номер на вашей веб-странице. Когда используется сеттер, он анимирует старое число в новое число с помощью твинера . Если исходное число равно 0, и вы установите его на 10, вы увидите, как числа быстро меняются от 0 до 10, скажем, за полсекунды. Пользователи любят эти вещи, и их интересно создавать.2. Геттеры / сеттеры в php
Пример от соф
цитаты:
источник
Вот пример, объясняющий самый простой способ использования методов получения и установки в java. Можно сделать это более простым способом, но у геттера и сеттера есть что-то особенное, что происходит при использовании закрытого члена родительского класса в дочернем классе в наследовании. Вы можете сделать это возможным, используя геттер и сеттер.
источник