Методы, которые мы определяли в предыдущих уроках, заканчивали свою работу тем, что печатали на экран какие-то данные:
public class App {
public static void greeting() {
System.out.println("Winter is coming");
}
}
Пользы от таких методов не очень много, ведь результатом их работы невозможно воспользоваться внутри программы.
Рассмотрим это на примере. Возьмем задачу обработки электронной почты. Когда пользователь регистрируется на каком-то сайте, то он может ввести почту любым способом:
_support@hexlet.io__
SUPPORT@hexlet.io
Если мы сохраним адрес в таком виде в базу данных, то пользователь не сможет войти на сайт, если будет вбивать адрес без пробелов и в другом регистре.
Чтобы этого не произошло, адрес нужно подготовить к записи в базу — привести его к нижнему регистру и обрезать пробелы по краям строки. Вся задача решается в пару строчек:
class App {
public static void main(String[] args) {
// Получаем адрес из формы
var email = " SuppORT@hexlet.IO";
// Обрезаем пробельные символы
var trimmedEmail = email.trim();
// Приводим к нижнему регистру
var preparedEmail = trimmedEmail.toLowerCase();
System.out.println(preparedEmail); // => support@hexlet.io
// Записываем в базу данных
}
}
Этот код стал возможен только благодаря возврату значения. Методы trim()
и toLowerCase()
ничего не печатают на экран. Они возвращают результат своей работы, и поэтому мы можем записать его в переменные. Если бы они вместо этого печатали на экран, мы бы не могли присвоить результат их работы переменной. Как мы не можем сделать с определенным выше методом greeting()
:
// Java будет ругаться, что `greeting()` ничего не возвращает
// Код не заработает
var message = App.greeting();
Изменим метод greeting()
таким образом, чтобы он начал возвращать данные, а не печатать их. Для этого нам понадобится выполнить две правки:
String
Посмотрим на измененный код:
class App {
public static String greeting() {
return "Winter is coming!";
}
}
Вместо void
теперь написано String
, потому что у метода есть возврат. Так мы указали Java, что результатом работы метода будет строка.
Еще обратите внимание на return
– это особая инструкция. Она берет выражение справа и отдает его наружу тому коду, который вызвал метод. Как только Java натыкается на return
, выполнение метода на этом завершается:
// Теперь этот код работает
var message = App.greeting();
// Мы можем выполнить какие-то действия над результатом
System.out.println(message.toUpperCase()); // => WINTER IS COMING!
Любой код после return
не выполняется:
class App {
public static String greeting() {
return "Winter is coming!";
// Любой код ниже не выполнится никогда
// Недостижимый код в Java даже не скомпилируется
System.out.println("Я никогда не выполнюсь");
}
}
Даже если метод возвращает данные, это не ограничивает его в том, что он печатает. Кроме возврата данных, мы можем и печатать их:
class App {
public static String greeting() {
System.out.println("Я появлюсь в консоли");
return "Winter is coming!";
}
}
// Где-то в другом методе программа
// и напечатает текст на экран, и вернет значение
var value = App.greeting();
Возвращать можно не только конкретное значение. Так как return
работает с выражениями, то справа от него может появиться почти что угодно. Здесь нужно руководствоваться принципами читаемости кода:
class App {
public static String greeting() {
var message = "Winter is coming!";
return message;
}
}
Здесь мы не возвращаем переменную — возвращается всегда значение, которое находится в этой переменной. Ниже пример с вычислениями:
class App {
public static long doubleFive() {
// или return 5 + 5;
var result = 5 + 5;
return result;
}
}
https://replit.com/@hexlet/java-basics-return
В этом примере в определении метода использовался long
, так как возвращается целое число.
Чтобы проверить знания из этого урока, попробуйте ответить на вопрос. Как думаете, что выведет этот код?
// Определение
class App {
public static int run() {
return 5;
return 10;
}
}
// Использование
App.run(); // => ?
Реализуйте статический метод sayHurrayThreeTimes()
, которая возвращает строку 'hurray! hurray! hurray!'.
var hurray = App.sayHurrayThreeTimes();
System.out.println(hurray); // => hurray! hurray! hurray!
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1import static org.assertj.core.api.Assertions.assertThat;
2
3class Test {
4 public static void main(String[] args) {
5 var expected = "hurray! hurray! hurray!";
6
7 final String actual = App.sayHurrayThreeTimes();
8
9 assertThat(actual).isEqualTo(expected);
10 }
11}
12
Решение учителя откроется через: