Java 9 - изучение REPL

Java 9 - изучение REPL

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()

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

jshell> helloWorld()
Hello world

4. переменные

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

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

jshell> String company = "example"
company ==> "example"
|  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 is smart enough to know when an expression is incomplete and will prompt the user to continue on a new line:с

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 = "example"
| 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 = "example";
 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 = "example"
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.