JDK 9には、対話型環境(REPL環境と呼ばれる)を提供するjshellコマンドが追加されます。
JDK 9 Releasesで試してみます。
Windows OSでは、コマンドプロンプトを開き、JDK 9のコマンド類が格納されているフォルダを環境変数PATHに追加します。
そして、jshellコマンドを実行すると、対話型環境のプロンプトが表示されます。
C:\Users\toru>jshell | JShellへようこそ -- バージョン9-ea | 概要については、次を入力してください: /help intro jshell>
java.time.LocalDateTimeクラスで今の日時を取得しようと、適当に入力すると、エラーになってしまいます。
jshell> now = LocalDateTime.now(); | エラー: | シンボルを見つけられません | シンボル: 変数 now | 場所: クラス | now = LocalDateTime.now(); | ^-^ | エラー: | シンボルを見つけられません | シンボル: 変数 LocalDateTime | 場所: クラス | now = LocalDateTime.now(); | ^-----------^ jshell>
型宣言なしの変数は受け付けてくれませんでした。Javaの文法にちゃんと従わないとダメなようです。
次に、インポート文なしでLocalDateTimeを使うと認識してくれませんでした。これもJavaの文法通りですね。ちなみに、インポートの一覧は、/importsコマンドで確認できます。デフォルトでは次のimportが有効です。
jshell> /imports | import java.util.* | import java.io.* | import java.math.* | import java.net.* | import java.util.concurrent.* | import java.util.prefs.* | import java.util.regex.* jshell>
では、java.time.*をインポートしてみましょう。
jshell> import java.time.* jshell> /imports | import java.util.* | import java.io.* | import java.math.* | import java.net.* | import java.util.concurrent.* | import java.util.prefs.* | import java.util.regex.* | import java.time.* jshell>
インポートが認識されました。
では、現在の日時を取得してみます。と、その前に、コマンドラインの補完を見てみましょう。
Lo と2文字を入れた直後にTABキーを押します。
jshell> Lo LocalDate LocalDateTime LocalTime Locale Logger Long LongSummaryStatistics jshell>
と、補完候補が表示されます。
Localまで入れてTABキーを押すと、
jshell> Local LocalDate LocalDateTime LocalTime Locale jshell>
と絞り込まれました。
LocalDと入れてTABキーを押すと、LocalDate と補完されます。補完されたLocalDateに続いてTを入れ、さらにTABキーを押すとLocalDateTimeに補完されます。UNIXのシェル環境程度には補完が効くようです。
では、今の日時を取得します。
jshell> LocalDateTime now = LocalDateTime.now() now ==> 2016-09-09T18:23:19.990769100 jshell>
おー、文が実行され、この場合左辺の変数の内容が表示されました。
次に、締め切り日時を作成します。
jshell> LocalDateTime due = LocalDateTime.of(2016, 9, 11, 23, 59, 59) due ==> 2016-09-11T23:59:59 jshell>
ここで、今の日時と締め切り日時が変数に取れたので、この2つの日時の間を算出します。
jshell> Duration remain = Duration.between(now, due) remain ==> PT53H36M39.0092309S jshell>
ということで、Java読書会BOF の次回課題図書投票締め切りまではあと53時間ちょっと、ということになります。
追記
- 補完はクラス名だけでなく、メソッド名も対象となります。
- printfはSystem.out.printfとせずに単独で使えます。printlnはだめだけど。
jshell> /methods | printf (String,Object...)void jshell>
と、デフォルトで裸で使えるメソッドとして登録されています。