Перейти к основному содержимому

Java 9 — Изучение REPL

· 5 мин. чтения

1. Введение

Эта статья посвящена jshell , интерактивной консоли REPL (Read-Evaluate-Print-Loop), которая входит в комплект JDK для предстоящего выпуска Java 9. Для тех, кто не знаком с концепцией, REPL позволяет интерактивно запускать произвольные фрагменты кода и оценивать их результаты.

REPL может быть полезен для таких вещей, как быстрая проверка жизнеспособности идеи или определение, например, отформатированной строки для String или SimpleDateFormat .

2. Бег

Для начала нам нужно запустить REPL, что делается путем вызова:

$JAVA_HOME/bin/jshell

Если требуется более подробный обмен сообщениями из оболочки, можно использовать флаг -v :

$JAVA_HOME/bin/jshell -v

Как только он будет готов, нас встретит дружеское сообщение и знакомая подсказка в стиле Unix внизу.

3. Определение и вызов методов

Методы можно добавить, введя их подпись и тело:

jshell> void helloWorld() { System.out.println("Hello world");}
| created method helloWorld()

Здесь мы определили вездесущий метод «hello world». Его можно вызвать, используя обычный синтаксис Java:

jshell> helloWorld()
Hello world

4. Переменные

Переменные могут быть определены с помощью обычного синтаксиса объявления Java:

jshell> int i = 0;
i ==> 0
| created variable i : int

jshell> String company = "ForEach"
company ==> "ForEach"
| created variable company : String

jshell> Date date = new Date()
date ==> Sun Feb 26 06:30:16 EST 2017
| created variable date : Date

Обратите внимание, что точки с запятой необязательны. Переменные также могут быть объявлены без инициализации:

jshell> File file
file ==> null
| created variable file : File

5. Выражения

Принимается любое допустимое выражение Java, и будет показан результат оценки. Если явный получатель результата не указан, будут созданы «скретч»-переменные:

jshell> String.format("%d of bottles of beer", 100)
$6 ==> "100 of bottles of beer"
| created scratch variable $6 : String

REPL очень полезен здесь, сообщая нам, что он создал временную переменную с именем $6 , значение которой — «100 бутылок пива на стене», а ее тип — String .

Также возможны многострочные выражения. Jshell достаточно умен, чтобы знать, когда выражение не завершено, и предложит пользователю продолжить с новой строки:

jshell> int i =
...> 5;
i ==> 5
| modified variable i : int
| update overwrote variable i : int

Обратите внимание, как подсказка изменилась на отступ …> , чтобы обозначить продолжение выражения.

6. Команды

Jshell предоставляет довольно много метакоманд, не связанных с оценкой операторов Java. Все они начинаются с косой черты (/), чтобы отличить их от обычных операций. Например, мы можем запросить список всех доступных команд, введя /help или /?.

Давайте посмотрим на некоторые из них.

6.1. Импорт

Чтобы вывести список всех импортов, активных в текущем сеансе, мы можем использовать команду /import :

jshell> /import
| import java.io.*
| import java.math.*
| import java.net.*
| import java.nio.file.*
| import java.util.*
| import java.util.concurrent.*
| import java.util.function.*
| import java.util.prefs.*
| import java.util.regex.*
| import java.util.stream.*

Как мы видим, оболочка запускается с уже добавленным несколькими полезными импортами.

6.2. Списки

Работать в REPL не так просто, как иметь под рукой полнофункциональную IDE: легко забыть, какие переменные имеют какие значения, какие методы были определены и так далее. Чтобы проверить состояние оболочки, мы можем использовать /var , /methods , /list или /history:

jshell> /var
| int i = 0
| String company = "ForEach"
| Date date = Sun Feb 26 06:30:16 EST 2017
| File file = null
| String $6 = "100 of bottles of beer on the wall"

jshell> /methods
| void helloWorld()

jshell> /list

1 : void helloWorld() { System.out.println("Hello world");}
2 : int i = 0;
3 : String company = "ForEach";
4 : Date date = new Date();
5 : File file;
6 : String.format("%d of bottles of beer on the wall", 100)

jshell> /history

void helloWorld() { System.out.println("Hello world");}
int i = 0;
String company = "ForEach"
Date date = new Date()
File file
String.format("%d of bottles of beer on the wall", 100)
/var
/methods
/list
/history

Разница между /list и /history заключается в том, что последний показывает не только выражения, но и команды.

6.3. Сохранение

Для сохранения истории выражений можно использовать команду /save :

jshell> /save repl.java

Это сохраняет нашу историю выражений в repl.java в том же каталоге, из которого мы запускали команду jshell .

6.4. Загрузка

Чтобы загрузить ранее сохраненный файл, мы можем использовать команду /open :

jshell> /open repl.java

Затем загруженный сеанс можно проверить, введя /var , /method или /list .

6.5. Выход

Когда мы закончим работу, команда /exit может завершить работу оболочки:

jshell> /exit
| Goodbye

До свидания jshell .

7. Заключение

В этой статье мы рассмотрели Java 9 REPL. Поскольку Java существует уже более 20 лет, возможно, она появилась немного позже. Однако он должен оказаться еще одним ценным инструментом в нашем наборе инструментов Java.