В то время как 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. Есть идея?