Каковы ограничения для JShell?
Я нашел этот вопрос, и этот другой, настолько интригующий, что это вызывает несколько вопросов, по крайней мере для меня:
Скорее открытый вопрос, но где это jshell
ограничен? Очевидно, что приложения с графическим интерфейсом не находятся в домене для jshell
решения или замена IDE:
Из области видимости выходят графические интерфейсы и поддержка отладчика. JShell API предназначен для обеспечения функциональности JShell в IDE и других инструментах, но инструмент jshell не предназначен для IDE.
Бонусные баллы за диаграммы Венна или другие визуальные эффекты.
Конечно, фрагменты должны быть ограничены в размерах. Я больше спрашиваю, какие проблемы нельзя решить с помощью фрагментов кода.
смотрите также:
2 ответа
Отвечая на обновленный вопрос
Все проблемы могут быть решены с помощью фрагментов кода (и с помощью достаточно сложного сценария оболочки). Но JShell лучше всего использовать для отладки и изучения Java - полноценная программа гораздо более гибкая для всех других вариантов использования.
JShell,.jsh и java MyClass.java
JShell - это интерактивная оболочка для тестирования Java-кода. По сути, это REPL для Java.
Поскольку JShell - это все, что вы вводите во фрагментах кода, которые он затем оценивает, и часто имеет смысл помещать эти фрагменты в файл, а не записывать их несколько раз, JShell поддерживает .jsh
скрипты, которые содержат коллекции фрагментов, которые будут интерпретироваться JShell. В этом смысле это похоже на принятие Bash .sh
файлы или command.com принимают .bat
файлы - ввод их построчно эквивалентен их импорту.
Выполнение Java-файла из одного источника - это совсем другой зверь. Это сахар, который заменяет, начиная с 11 JDK,
java MyClass.java arg1 arg2 arg3
вашим локальным сценарием, эквивалентным написанию
TMPDIR=$(mktemp -d)
javac -d $TMPDIR MyClass.java
java -cp $TMPDIR MyClass arg1 arg2 arg3
rm -rf $TMPDIR
Это позволяет быстро выполнять файлы с одним исходным кодом из командной строки с помощью одной команды и не оставлять их скомпилированные классы повсюду (фактический временный каталог создавать не нужно, так как java
может хранить эти классы в памяти). Так как у них уже было 3 других режима выполнения в java
(для классов, jar-файлов и модулей) нет ничего сложного в том, чтобы добавить это в качестве четвертого.
Java как язык сценариев
Теперь, когда различие ясно (.jsh предназначен для использования с JShell, исполняемые файлы Java с одним исходным кодом предназначены только для, как вы уже догадались, исполняемых файлов Java с одним исходным кодом), как насчет использования Java в качестве языка сценариев?
У вас всегда была возможность написать программу запуска; например,
#!/bin/bash
java -jar MyApp.jar
работал целую вечность. Технически было возможно дать имя классу напрямую, но не слишком полезно, поскольку файлы JAR намного удобнее при распространении двоичных файлов - во-первых, они избегают зеркального отображения структуры пакета в виде набора папок. Однако наличие сценария запуска отдельно от реального кода Java все еще было несколько недружелюбным: теперь вам нужно держать оба вместе или, по крайней мере, иметь возможность запуска фактического.jar для запуска.
Теперь они также представили следующий ярлык: независимо от имени файла или расширения, вы можете распространять свой исходный код Java с "префиксом shebang" следующим образом:
#!/path/to/java --source 11
<source of MyClass.java>
пометьте его как исполняемый и запустите из командной строки так же, как вы можете запустить любой другой исполняемый файл. Например, скопируйте и вставьте это в helloworld
файл (и исправьте местоположение JDK, прежде чем пытаться запустить его):
#!/opt/jdk-11.0.1/bin/java --source 11
public class Test {
public static void main(String ... args) {
System.out.println("Hello " + (args.length == 0 ? "world!" : args[0]));
}
}
Отметив его как исполняемый, вы можете запустить его непосредственно с
$ ./helloworld
Hello world!
и он даже принимает свои аргументы правильно:
$ ./helloworld Bob!
Hello bob!
Для небольших программ и при условии, что вам не нужно выходить за пределы JDK для добавления дополнительных библиотек, теперь будет значительно проще распространять код Java для использования в командной строке.
Java по-прежнему не будет "языком сценариев" (он никогда не будет конкурировать, скажем, с Python), но
- у него очень хороший цикл REPL
- Вы можете выполнять короткие программы намного проще
Ну, конечно, он ограничен использованием обычной утилиты REPL с точки зрения определения возможностей, которые могут обеспечить IDE и графические пользовательские интерфейсы. Я бы хотел больше рассказать о его возможностях по сравнению с программами с одним исходным кодом. Функции, которые держат его отдельно от программ с одним исходным кодом:
- история с редактированием
- Вкладка-завершение
- автоматическое добавление необходимых конечных точек с запятой и
- настраиваемый предопределенный импорт и определения
Как уже упоминалось в альтернативах JEP-файлам с одним файлом:
Мы могли бы делегировать задачу "разовых пробегов"
jshell
инструмент Хотя на первый взгляд это может показаться очевидным, это было явной нецелевой задачей при разработкеjshell
,
jshell
Инструмент был разработан, чтобы быть интерактивной оболочкой, и было принято много дизайнерских решений в пользу обеспечения лучшего интерактивного опыта.Нагрузка на него дополнительными ограничениями того, чтобы быть участником серии, отвлекла бы от интерактивного опыта.
!!! Ограничения и поведение!!!
С другой стороны, несколько ограничений (предполагаемых функциональных возможностей), которые можно было бы найти при выполнении практической работы с использованием JShell, а не просто при чтении документов:
использование конечных переменных конечные переменные не работают должным образом в jshell
конечно отладка с помощью JShell
интеграция jshell с IDE Java 11 JShell внутри Intellij IDEA
отключение истории Отключить историю JShell
Переопределенные переменные должны быть сброшены. В jshell-11 почему повторно объявленная ссылочная переменная, которая сбрасывается в null, все еще имеет тип?
создать модуль с помощью jshell Create Module в JShell в Java 9
импорт классов закрытого пакета Импорт классов закрытого пакета в JShell
область видимости объектов Доступ к "родительской области видимости" в JShell
очистить консоль jshell Как очистить консоль Java 9 JShell?
!!! Особенности и многое другое!
Подробнее о ссылках, которые дают ему преимущество над программами с одним исходным кодом:
почему и как почему и как вы используете JShell?
импорт пути к классам для проекта В JShell, как импортировать путь к классам из проекта Maven
запустить приложение через JShell Как запустить приложение Java с помощью jshell?
установить пользовательские режимы обратной связи Создать пользовательский режим обратной связи в jshell
загрузка скриптов при запуске Различные способы загрузки скрипта при запуске jshell
список активных методов Список всех активных методов в jshell
запустить файл jshell Как запустить файл JShell?
выполнить javascript с помощью jshell Как выполнить java-скрипт с помощью jshell?
Как использовать ссылки на методы в jshell Есть ли способ использовать ссылки на методы для функций верхнего уровня в jshell?