В то время как Java 9 принесла нам JShell и новый клиент Http (в стадии инкубации), Java 10 добавила ключевое слово var (также известное как определение типа локальной переменной) в таблицу сценариев с Java. В этом посте мы объединим возможности JShell с краткостью var.
Вы всегда хотели JShell
Если вы еще не слышали о JShell REPL, представленной в Java 9, вам, вероятно, следует посмотреть видео (как это, начало в 59:00) от Venkat Subramaniam, демонстрирующее JShell REPL.
Вы, наверное, хотите var
Хотя некоторые могут поставить под сомнение преимущества использования var в обычном мире Java, преимущества использования var в контексте сценариев, несомненно, велики. А именно:
- нет необходимости импортировать возвращаемый тип (меньше кода)
- не нужно указывать типы (меньше кода, намного проще писать)
- более легкая читаемость
Теперь нужно использовать var? Точно нет!
Ты хочешь? Да, наверное, ты хочешь!
Собираем все вместе
Теперь вы можете спросить себя:
Могу ли я наконец использовать Java в качестве языка сценариев и называть его JavaScript?
Да и нет (нет, вы не можете называть это JavaScript по понятным причинам).
Что вы можете сделать с помощью JShell, так это поместить код сценария в файл с кодом с именем myscript.jsh и выполнить его с помощью: jshell myscript.jsh. Сказать, что эта функция предназначалась для использования в сценариях реального мира, было бы преувеличением, но она вполне могла сработать!
Взгляните на следующие примеры и удивитесь! (или испугался - ваш выбор)
HTTP-клиент
Часто вы хотите проверить удаленный источник с помощью простого скрипта.
Например. этот сайт изменился? Смогу ли я наконец купить билеты на следующий концерт Lady Java?
Используя новый HTTP-клиент, var и JShell, мы можем собрать этот удобный для чтения скрипт:
/ exit в конце необходим, чтобы JShell оставался после выполнения.
Работа с каталогами и файлами
Часто в сценариях вы хотите работать с файлами и каталогами, но со стандартной библиотекой Java это не совсем просто. Поэтому мы просто используем FileUtils из Apache Commons, чтобы уменьшить объем кода:
Передача аргументов командной строки
К сожалению, передача аргументов через командную строку напрямую не поддерживается в JShell. Существует один необычный обходной путь, позволяющий передавать аргументы через свойства системы, как показано в примере ниже:
Подходит к концу (или / выход?)
Давайте посмотрим на плюсы и минусы написания сценариев с помощью JShell и Java.
Плюсы
- Часто используемые пакеты уже импортированы
- Написание сценариев, не зависящих от ОС (Java / JShell работает в Windows, Linux, macOS и т. Д.)
- Используйте тот же язык для написания сценариев, который вы уже используете для разработки программного обеспечения.
- Возможно, это способ обойти правила компании, которые разрешают использовать только Java в качестве языка программирования (но не Groovy или Python).
Минусы
- / exit в конце файлов сценария необходимо, если вы хотите, чтобы JShell завершил работу после выполнения
- Многострочный не работает должным образом (не разбивайте одно выражение на несколько строк)
- Нет простой обработки аргументов командной строки (временное решение - через системные свойства)
- API-интерфейсы Java довольно сложны для использования в сценариях (особенно при написании без IDE).
В целом становится ясно, что JShell не предназначался для использования в качестве интерпретатора скриптов, но с учетом этих немногих недостатков он работает нормально.
Я создал репозиторий Github, содержащий несколько примеров сценариев JShell, которые вы можете клонировать, чтобы начать карьеру в JShell:
PS: Проект все еще ищет простой и безопасный сценарий веб-сервера, который можно использовать для обслуживания JSON. Есть идея?