Методы Get и Set в Java.Как они работают? - PullRequest
1 голос
/ 02 апреля 2012

Я пытаюсь получить лучшее понимание, чем я мог до сих пор ... это чтобы помочь мне с классом, но не с каким-либо конкретным домашним заданием;Я ищу более концептуальную информацию, которую я не нашел ни в своем учебнике, ни в учебниках.На чисто теоретическом уровне я понимаю, почему инкапсуляция эффективна для ОО-программирования, но мне нужно лучше понять, что именно происходит.Я постоянно путаюсь с тем, по какому пути протекают данные, и удивляюсь, откуда мы получаем и устанавливаем данные ОТ.Надеемся, что это не исключение из правила «нет глупых вопросов».

Рассмотрим:

 public class Employee
 {
    private int empNum;
    public int getEmpNum()
    {   return empNum;   }
    public void setEmpNum(int Emp)
    {   empNum = emp;   }
 }

Моя интерпретация этого: используя int Emp, переданный откуда-то, мы устанавливаемобъявленная переменная empNum в методе set....Затем мы get... эту переменную и возвращаем ее вызывающему методу.Это хорошее понимание?

Далее рассмотрим:

import.javax.*
public class CreateEmp
{
    public static void main(String[] args)
    {
         int ssn;
         ssn = JOptionPane.showInputDialog(null,"enter ssn");
         Employee newEmp = new Employee(123456789);
         JOptionPane.showMessageDialog(null,"Employee ID " + newEmp.getEmpNum);
     }
 }

С этим классом мне не нужно явно set переменная, потому что объявление new Employee(123456789) автоматически отправляет это значениеset... метод.return в методе Employee возвращает результирующее значение вызывающему методу и делает эту переменную доступной, в данном случае для вывода моего диалогового окна.У меня есть ручка?

Вот где я запутался.С моим пониманием, как отмечалось выше - что может быть не так - я никогда не могу выбрать лучшее место для размещения логики.Например: я бы поместил диалоговое окно «введите номер сотрудника» в класс Employee, с условием запускать ТОЛЬКО, если параметр, переданный методу, был нулевым.На мой взгляд, насколько я понимаю поток данных, цель этого класса - получить номер сотрудника.Если он не указан по умолчанию, его нужно создать.Я не уверен, является ли это мышление наилучшей практикой, или я готовлюсь к неприятностям позже.

Мне бы хотелось услышать некоторые мысли о том, правильно ли я понимаю, что происходит.

Ответы [ 5 ]

2 голосов
/ 02 апреля 2012

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

В любом случае, первая часть с 'get' и 'set' вы понимаете хорошо. Теперь, когда вы сказали, что вам не нужно явно устанавливать номер сотрудника, потому что вы делаете «новый сотрудник ...», это не совсем так. Это сработало бы, если бы вы явно определили конструктор , который принимает целое число для аргумента, а затем устанавливает значение empNum равным аргументированному целочисленному значению.

Методы получения и установки обычно используются вместе с модификатором 'private'. Сеттеры могут использоваться для управления вводом. Например, вы можете проверить, является ли предоставленное значение больше нуля, где вы не можете, если вы даете прямой доступ. Получатели просто разрешают извлечение значений, но для внесения изменений вы принудительно используете соответствующий установщик (если есть).

Вы правы в том, что если значение не указано, вы должны установить его по умолчанию. Учтите, что полученное вами значение (если оно есть) должно использоваться в другом классе. Что если пользователь никогда не установит значение? Что если это не то, что вы ожидали? Другой класс, каким бы он ни был, все еще требует значения, и вам все равно нужно что-то передавать. Установив значение по умолчанию, другой класс может распознать, что «о, это значение по умолчанию - это означает, что пользователь, вероятно, не предоставил правильный ввод». Тем самым вы создаете относительно безопасное приложение; Вы можете продолжать работать, даже если ввод не соответствует ожидаемому.

2 голосов
/ 02 апреля 2012

Зависит от того, как вы используете объект Employee. Если при создании вы всегда предоставляете номер сотрудника или номер автоматически предоставляется, а номер сотрудника никогда не указывается где-либо еще, то вам не понадобится метод set.

Однако, если в какой-то момент вы собираетесь установить номер сотрудника на что-то другое (возможно, была допущена ошибка и необходимо обновить номер), вам потребуется метод "set". В этом случае, вероятно, будет проще всего также вызвать метод "set" из конструктора.

Это действительно зависит от того, как будет использоваться класс класса Employee.

2 голосов
/ 02 апреля 2012

Смысл использования общедоступных методов доступа к закрытым переменным состоит в том, чтобы контролировать доступ к этим переменным и обеспечивать согласованность всего внутреннего состояния.Например, класс может иметь переменную age и birthdate.Установка birthdate также неявно устанавливает возраст.Если бы к этим переменным был предоставлен прямой доступ, то было бы возможно установить для них несовместимые значения (т. Е. День рождения говорит, что им 30, а возраст установлен на 35).Используя сеттеры, мы можем гарантировать, что установка даты рождения вернет правильный возраст.

В этом примере использование сеттеров также позволит нам преобразовать переменную age в сгенерированное свойство.Поскольку возраст можно напрямую определить с помощью birthdate, вы можете создать геттер для age, чтобы он напрямую вычислял и возвращал возраст без необходимости хранить его где-либо.

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

1 голос
/ 02 апреля 2012

С этим классом мне не нужно явно устанавливать переменную, потому что объявление нового Employee (123456789) автоматически отправляет это значение в метод set ....Возврат в методе Employee возвращает результирующее значение вызывающему методу и делает эту переменную доступной, в данном случае для вывода моего диалогового окна.У меня есть справка об этом?

Ваше понимание здесь немного неверно.Оператор

new Employee(123456789)

создает новый объект Employee с помощью метода конструктора.Конструкторы обычно принимают параметры, которые используются для установки внутренних переменных-членов класса.Таким образом, полный класс Employee будет -

public class Employee
{
  private int empNum;

  public Employee(int employeeNum) {
    empNum = employeeNum;
  }
  public int getEmpNum() {
    return empNum;   
  }
  public void setEmpNum(int Emp) {
    empNum = emp;   
  }
} 
1 голос
/ 02 апреля 2012

Вы говорите

С этим классом мне не нужно явно устанавливать переменную, потому что объявление нового Employee (123456789) автоматически отправляет это значение в метод set ....

Я почти уверен, что это неправда.Учтите это: Java создает объект Employee, а конструктор получает значение 123456789.Как он узнает, какой переменной нужно присвоить это значение?Это не знает.Может быть несколько переменных, которые принадлежат этому объекту, поэтому он не знает, что на самом деле означает 123456789.

Когда вы не определяете конструктор в Java, он автоматически создает его для вас.Но этот не принимает никаких аргументов, это просто конструктор по умолчанию.В вашем коде есть несколько ошибок компиляции (например, строка импорта для javax неверна), поэтому я предполагаю, что вы используете ранее скомпилированную версию своего кода.Удалите все .class файлы в вашем проекте, исправьте ошибки компиляции и запустите снова.Это должно дать вам ошибку.Это также значительно облегчит понимание потока данных.Конструктор должен выглядеть примерно так:

public Employee(int empNum) {
    this.empNum = empNum;
}

Теперь гораздо больше смысла в том, что getEmpNum() знает, какое значение вернуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...