Методы: Как их писать
Введено| English | Значение |
|---|---|
| accessor/əkˈsesə/ | Доступ к данным (аксессор) |
| mutator/mjuːˈteɪtə/ | Изменение данных (мутатор) |
Отклонённое обновление сохраняет предыдущее состояние
- Счёт начинается со 20. Метод setScore(s) присваивает значение только при s >= 0; вызов setScore(-5) оставляет счёт на уровне 20.
- Охранитель (guard) предотвращает некорректное обновление. Последующий вызов getScore() вернёт существующее состояние, а не отклонённый аргумент.
Написание метода
- Метод состоит из заголовка и тела. Заголовок:
public void addScore(int s)— модификатор доступа, тип возвращаемого значения, имя, параметры. - Тело: инструкции в
{ }, выполняющие работу. Метод может читать и изменять переменные экземпляра объекта.
Возвращаемые значения
- Тип возвращаемого значения метода указывает, что он возвращает; используйте
return value;для его передачи.public int getScore() { return score; }возвращает текущий счёт. voidметод возвращает ничего — он просто выполняет свою задачу (например, вывод). Возвращаемое значение должно быть совместимо с назначением типа; например, значениеintможет быть расширено и возвращено методомdouble.
Метод public double result() { return 3; } может скомпилироваться, хотя 3 — это целочисленный литерал.
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Java расширяет результат типа int до double; возвращаемые значения должны быть совместимыми, но не обязательно иметь идентичный тип записи.
Геттеры и сеттеры
- Доступник (getter) возвращает информацию, не изменяя объект:
getScore(). Изменитель (setter) изменяет состояние объекта:addScore(s)илиsetName(n). - Геттеры обычно возвращают
int/String; сеттеры обычноvoid. Вместе они формируют публичный интерфейс объекта над его приватными данными.
Геттер возвращает значение
Начиная со значения score 20, вызов setScore(-5) отклоняет обновление; getScore возвращает 20.
Метод, который возвращает информацию, не изменяя объект, это...
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Геттеры читают и возвращают; сеттеры изменяют состояние.
Метод void...
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
void = нет возвращаемого значения; он просто выполняет действие.
A non-void method may reach its closing brace and complete normally without returning a value.
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
A path completing normally must return a compatible value. A path that throws an exception is a different case.
Какой метод может валидировать входные данные до изменения состояния?
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Сеттер может проверить (например, отвергнуть отрицательные значения) перед присвоением.
Написание return-значения внутри метода void компилируется корректно.
Сложность 1/5 · 100 монет + небольшой бонус за первое выполнение сегодня
Метод void не может возвращать значение — это не скомпилируется.
Методы могут выполнять проверку
- Поскольку внешний код проходит через методы, метод может проверить данные перед действием.
public void setScore(int s) { if (s >= 0) score = s; }отвергает отрицательный счёт. - Приватный доступ препятствует прямому присвоению поля стороннему коду. Конструкторы и все методы класса, записывающие это поле, должны соблюдать установленное правило; охраняемый сеттер не может исправить невалидное начальное значение самостоятельно.
Нестатический void-метод должен возвращать совместимое значение на каждом пути нормального завершения. Путь может вместо этого выбросить исключение. Если int-метод достигает конца без возврата, компиляция завершается ошибкой. Сигнатура void не возвращает значений, поэтому там корректно использовать return; (или отсутствие оператора return); запись return value; в метод с сигнатурой void не скомпилируется.
For the stated guarded setter, what does getScore() return after setScore(-5)?
Сложность 2/5 · 140 монет + небольшой бонус за первое выполнение сегодня
The condition fails, so no assignment occurs and the old score remains 20.
Начиная со значения score 20, вызов replaceScore(30) сохраняет старое значение score, присваивает 30, а затем возвращает старое значение score. Какое значение вернет этот вызов?
Сложность 2/5 · 140 монет + небольшой бонус за первое выполнение сегодня
Возвращаемое старое значение score равно 20; новое сохраненное значение score равно 30. Возврат значения не предотвращает мутацию.
Геттер и сеттер:
- Геттер:
public int getScore() { return score; }— читает, возвращаетint. - Сеттер:
public void addScore(int s) { score += s; }— изменяет состояние, ничего не возвращает. student.addScore(10); int now = student.getScore();
Перенесите рассуждения на новый случай
- Рассмотрите
public int replaceScore(int s) { int old = score; score = s; return old; }. Это мутатор, хотя он возвращает значение: начиная со значения 20, вызов replaceScore(30) возвращает 20 и оставляет счет равным 30. - Оценивайте поведение, а не имена или типы возвращаемых значений. Метод под именем getScore, который увеличивает счёт, не является чистым геттером, а метод void, который лишь выводит сообщение, не обязан изменять объект.
Метод имеет заголовок (модификатор доступа, тип возврата, имя, параметры) и тело. Не void-метод должен return значение, совместимое с назначением, на каждом пути, завершающемся нормально; void-метод ничего не возвращает. Аксессоры (геттеры) возвращают состояние без изменения его; мутаторы (сеттеры) изменяют состояние и могут проверять новое значение.