Nano Hash - криптовалюты, майнинг, программирование

Как работают геттеры и сеттеры?

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

10.01.2010

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

Ответы:


1

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

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;
}
10.01.2010
  • так что геттер - это просто метод получения частного поля, а сеттер устанавливает новое поле. спасибо за отличное объяснение по коду 10.01.2010
  • не могли бы вы передать параметр получателю? 10.01.2010
  • noname: Нет и нет. Getter - это способ получить значение, но НЕ раскрывать значение, содержащееся в поле, то есть, если вы вызываете someObj.getTime().setHour(5), это не должно влиять на внутреннее состояние someObj. Также сеттеры и геттеры (аксессоры и мутаторы по их более интересному имени) имеют очень строгую сигнатуру метода, означающую, что у геттера нет никаких параметров. В любом случае методы в целом должны делать только одно. 10.01.2010
  • @noname: Когда простым вещам даются сложные / большие / абстрактные имена, у вас есть то, что называется шаблоном проектирования ... И это пример шаблона объяснения рекурсивных концепций, который я только что придумал ;-) 15.01.2010
  • В eclipse, когда вы создаете поле, оно показывает вам предупреждение и предоставляет возможность создать для вас геттер и сеттер, но в геттере не используется ключевое слово this, мне интересно, почему. 03.11.2013
  • @qed: ключевое слово this необязательно, если нет конфликта с чем-то, имеющим более конкретную область действия. В приведенном вами примере созданный установщик будет иметь единственный параметр, имя которого совпадает с именем поля, поэтому this.fieldName = fieldName используется, чтобы отличить, что поле назначается, а не параметр, назначаемый самому себе, поскольку fieldName = fieldname достигнет . В геттере такого конфликта нет. 04.11.2013
  • меня беспокоит то, что я задаюсь вопросом: может ли создание функции с именем типа "get"+capitalize(<field_name-here>)+"()" сделать ее получателем? эти имена какие-то особенные для Java? Не могли бы вы связать конкретную часть JLS, если так? 07.12.2013
  • Имея опыт работы с ActionScript и JS, я привык к тому, что вы можете использовать геттер / сеттер как свойство (например, this.myField = "Hello"). Как сказала накса; таким образом, это не столько настоящий геттер / сеттер, сколько соглашение. Если я прав, я мог бы просто назвать установщик updateMyField или что-то в этом роде, верно ?! 26.06.2014
  • Как установить 1000 значений в методе установки и получить через метод получения? Он перезаписывает значения, доступна только 1000-я. 27.07.2015
  • Учебник для этого не требуется. Я ненавижу этот ответ. Какая ограниченность. Очевидно, что этот подход нежелателен, так как он использует длинное «getThing» - там, где в других языках очень возможно и рекомендуется для синтаксического сахара использовать = my.thing для получения или my.thing= для установки. Вы утверждаете, что никому не нужен учебник, и утверждаете, что все должны знать, что это случай с Java ... но мы все обсуждаем это на этой странице? Как мы все сюда попали? 07.06.2018

  • 2

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

    10.01.2010
  • Разве у этих конструкторов не должно быть void? 10.03.2014
  • Здесь действительно нужна пустота. Если у вас его нет, вы получите: error: invalid method declaration; return type required 18.08.2014
  • Пустота здесь не требуется 14.12.2015
  • @JasonHartley: конструктор не имеет возвращаемого типа. 03.08.2016
  • @Mark Byers Итак, конструктор используется для инициализации экземпляра, а установщик используется для изменения любого заданного атрибута. Это правильно? 11.09.2019

  • 3
    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 будет распечатан
    25.01.2014

    4

    Вы также можете прочитать Почему получатель и сеттер-методы - зло:

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

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

    10.01.2010

    5

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

    цитаты:

    06.01.2016

    6

    Вот пример, объясняющий самый простой способ использования методов получения и установки в 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();
            }
    
        }
    
    18.05.2017
  • Я не собираюсь опускать вас (не стоит усилий). Имейте в виду, что (1) вы ответили на вопрос Java, где язык программы должен быть на Java. (2) Если вы хотите опубликовать, убедитесь, что макет выполнен правильно. (3) Вы неправильно используете инкапсуляцию (геттер (или аксессор) и сеттеры (или мутаторы)). Посмотрите, что означает инкапсуляция ... (проверьте проголосованный ответ) 18.05.2017
  • @KarelG извините, я не прочитал теги. я обновил его до java. спасибо, что поняли меня. 18.05.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..