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.