Специальная обработка JDK 9 jshell printf()?

Я изучал JDK9 и заметил, что в jshell вам не нужно ставить префикс printf() с System.out.printf(), т. е. вы можете написать < strong>printf("test"), но вы не можете написать println("test")

введите здесь описание изображения

Это особенность только jshell? Как вы можете добиться такого же поведения в приложении?

Ближе всего следующее:

import static java.lang.System.out ;
out.println("test");
out.printf("test");

person firephil    schedule 24.11.2016    source источник
comment
Для справки: printf был удален.   -  person Hugues M.    schedule 07.06.2017
comment
Разочарованный темпами инноваций в java и принятием решений во многих областях языка, в любом случае печать является базовой и важной функцией, я не понимаю, почему они удалили ее из импорта оболочки по умолчанию.   -  person firephil    schedule 07.06.2017


Ответы (2)


Похоже, что printf — это команда в JShell, а println — нет (как и в оболочке bash). Метод printf(), используемый System.out, отличается от того, который использует jshell, и поэтому его нельзя статически импортировать в приложение Java.

Источники:

http://jakubdziworski.github.io/java/2016/07/31/jshell-getting-started-examples.html https://jshelltutorial.com/jshells-printf-method/

person Eddie Curtis    schedule 24.11.2016
comment
Спасибо за обновление, чтобы показать ваше использование. Я отредактировал свой ответ, если он все еще не имеет смысла, дайте мне знать, и я объясню дальше. - person Eddie Curtis; 24.11.2016
comment
Я также искал некоторые идеи о том, как это достигается... Или это просто особенность jshell - person firephil; 24.11.2016
comment
Это просто особенность jshell. Думайте об этом как о функции, которая доступна только при использовании jshell, просто так случилось, что она имеет то же имя, что и метод Java. - person Eddie Curtis; 24.11.2016
comment
Нашел youtu.be/jziVaht480w?t=18m29s От создателя jshell, это метод который переносит System.out.printf() в локальный метод prinf(), который неявно импортируется при запуске jshell... - person firephil; 24.11.2016
comment
Хорошая находка! Если мой ответ помог вам, отметьте его как принятый ответ. Если нет, пожалуйста, опубликуйте свой собственный ответ или обновите вопрос, указав что-нибудь еще, что вам нужно знать. - person Eddie Curtis; 24.11.2016

В более ранних версиях раннего доступа был предопределенный метод printf, который перенаправлял на System.out.printf. С этим было две проблемы: это не стандартная Java, и, как указано в других ответах, она была непоследовательной в том, что print и println не были определены.

В текущем раннем доступе и в том, что будет поставляться, нет автоматически определяемых методов печати. Если вы хотите этого, запустите jshell с помощью:

jshell --start DEFAULT --start PRINTING

Что даст вам полный набор методов печати.

Чтобы ответить на вторую часть вопроса, вы можете увидеть определения методов перенаправления, используя команду /method после запуска, как указано выше. Добавление их в класс даст вам доступ, но это довольно уродливо. В качестве альтернативы вы можете сделать их общедоступными статическими методами в классе и импортировать их.

person Robert Field    schedule 30.08.2017