Java 9のJShellを使ってjava.time.LocalDateを操作する方法
JShellは、Java 9で導入されたREPL(Read-Eval-Print-Loop)型の対話型ツールです。ユーザーが入力したコードをその場で評価し、結果を即座に返してくれるため、小さなコード断片の動作確認やAPIの学習に非常に便利です。
LocalDateクラスとは
java.time.LocalDateクラスは、日付情報(年/月/日)やその関連属性を取得するための多数のメソッドを提供しています。また、うるう年かどうかといった日付の分類に関するメタ情報も取得できます。
LocalDateクラスはイミュータブル(不変)である点が重要な特徴です。日付に対して加算や減算を行うメソッド(plusDays、minusMonthsなど)を呼び出しても元のオブジェクトは変更されず、計算結果として常に新しいLocalDateインスタンスが返されます。
以下の2つのコードスニペットでは、JShell上でLocalDateクラスのさまざまな操作を実行し、その結果を確認しています。
スニペット1:日付情報の取得
jshell> import java.time.*; jshell> LocalDate today = LocalDate.now() today ==> 2020-04-22 jshell> today.getYear() $3 ==> 2020 jshell> today.getDayOfWeek() $4 ==> WEDNESDAY jshell> today.getDayOfMonth() $5 ==> 22 jshell> today.getDayOfYear() $6 ==> 113 jshell> today.getMonth() $7 ==> APRIL jshell> today.getMonthValue() $8 ==> 4 jshell> today.isLeapYear() $9 ==> true jshell> today.lengthOfYear() $10 ==> 366 jshell> today.lengthOfMonth() $11 ==> 30
このスニペットでは、まずimport java.time.*;で日時APIをインポートし、LocalDate.now()で現在の日付を取得しています。その後、年(getYear)、曜日(getDayOfWeek)、月の何日か(getDayOfMonth)、年の何日目か(getDayOfYear)、月名(getMonth)、月の数値(getMonthValue)などを順に呼び出しています。
さらに、isLeapYear()で2020年がうるう年であること(true)、lengthOfYear()で年間日数が366日であること、lengthOfMonth()で4月が30日までであることも確認できます。
スニペット2:日付の加算と減算
jshell> today.plusDays(50) $12 ==> 2020-06-11 jshell> today.plusMonths(50) $13 ==> 2024-06-22 jshell> today.plusYears(50) $14 ==> 2070-04-22 jshell> today.minusYears(50) $15 ==> 1970-04-22 jshell> LocalDate yesterYear = today.minusYears(50) yesterYear ==> 1970-04-22 jshell> today today ==> 2020-04-22
このスニペットでは、plusDays(50)で50日後、plusMonths(50)で50か月後、plusYears(50)で50年後の日付をそれぞれ計算しています。minusYears(50)を使えば50年前の日付も簡単に求められます。
注目すべきは最後の部分です。変数yesterYearに「50年前の日付」を代入した後で改めてtodayを参照しても、値は2020-04-22のまま変化していません。これはLocalDateがイミュータブルであることを示しており、加算・減算の操作は元のオブジェクトを書き換えるのではなく、常に新しいインスタンスを返すためです。
まとめ
JShellを使えば、コンパイルやクラス作成なしにjava.time.LocalDateの各メソッドを手軽に試せます。日付情報の取得から加算・減算まで、対話形式で即座に結果を確認できるため、Javaの日時APIを学習する際の最初の一歩として最適です。
-
Java 9でJavaFXを使ってJShellをプログラムから実装する方法
JShellは、サンプル式を対話的に実行できるツールです。通常はコマンドラインから利用しますが、JavaFXアプリケーションの中でプログラム的にJShellを実装することも可能です。その場合、Javaプログラムに以下のパッケージをインポートする必要があります。import jdk.jshell.JShell; import jdk.jshell.SnippetEvent; import jdk.jshell.VarSnippet;これらのクラスの役割は次のとおりです。JShell:評価エンジンの本体。式や文を評価(eval)するためのAPIを提供します。SnippetEvent:評価結果として
-
JavaのJWindowを使ってスプラッシュ画面を実装する方法
JWindowは、デスクトップ上の任意の位置に表示できるコンテナです。JFrameと異なり、タイトルバーやウィンドウ管理ボタンなどの装飾要素を持ちません。JWindowは、唯一の子クラスとしてJRootPaneを含んでいます。そのcontentPaneが、JWindowに追加される子コンポーネントの親となります。JFrameと同様に、JWindowもトップレベルコンテナの一つであり、「装飾のない(undecorated)JFrame」と考えることができます。タイトルバーやウィンドウメニューといった機能は備えていません。この特性を活かすと、JWindowはスプラッシュ画面として利用できます。アプ