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

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

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

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

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

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

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

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

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

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

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

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



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

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

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



 как вы используете объект 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 возвращает результирующее значение вызывающему методу и делает эту переменную доступной, в данном случае для вывода моего диалогового окна. У меня есть ручка на это?

Ваше понимание здесь немного неверно. Заявление

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