Методы Get и Set в Java. Как они работают?

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

Рассмотреть возможность:

 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 класс, с условием запуска ТОЛЬКО, если параметр, переданный методу, был нулевым. На мой взгляд, насколько я понимаю поток данных, цель этого класса - получить номер сотрудника. Если он не указан по умолчанию, его нужно создать. Я не уверен, является ли это мышление наилучшей практикой или я готовлюсь к неприятностям позже.

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

 dwwilson6602 апр. 2012 г., 02:09
Я думаю, что это то, где я немного запутался, вероятно, потому что я был процедурным программистом всю свою жизнь до сих пор. Комбинации get-set в другом классе, отличном от UI, кажутся мне такими, как UI создает значение, отправляет его в get-set, а затем возвращает его в UI. Почему бы просто не пропустить get-set и использовать значение в пользовательском интерфейсе? Я знаю, что это связано с абстракцией, но с упрощенными играми в кости, карточками и программами для сотрудников, которые мы создавали, может быть просто слишком элементарно, чтобы сделать этот гель для меня.
 Dave Newton02 апр. 2012 г., 00:06
Пользовательский интерфейс долженне быть в классе Employee, потому что сотруднику все равно, как он получает информацию, и не должен. В Java нет ничего «автоматического» почти всегда: единственный способ, которым значение параметра конструктора устанавливается равным значению экземпляра, это если значение экземпляра - если его устанавливает конструктор: в вашем примере нет ничего, кроме конструктора по умолчанию, поэтому попытайтесь создать экземпляр с помощью ctor с параметром не сможет скомпилироваться.

Ответы на вопрос(5)

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

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

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

 John Haager02 апр. 2012 г., 00:09
В качестве быстрого продолжения вам не нужно объявлять методы получения и установки для всех ваших переменных. Как упоминает @JHenderson в своем ответе, если у вас есть переменная, которую не следует сбрасывать, не объявляйте сеттер, поскольку вы не хотите, чтобы другие классы его изменяли.
Решение Вопроса

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

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

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

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

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

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

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

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

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

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

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

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

потому что объявление нового 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;   
  }
} 

Ваш ответ на вопрос