«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 = "Baeldung"
company ==> "Baeldung"
|  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 = "Baeldung"
| 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 = "Baeldung";
 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 = "Baeldung"
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.