【12/20】Java23でリリースされた機能を触ってみた!!
こんにちは!!
Marvelに入社してそろそろ一年になる肥田です🙇
現在は、JavaとTypeScript(React)で実装されたアプリケーションの開発案件に参画しています。
今回は、JJUG CCC 2024 Fallにスタッフ参加した時に、
Java23で実装されたコードのクイズがあって今まで触ってきたJavaとあまりにも雰囲気が変わっていたので、『これは触ってみなくては!!』と思い、触ってみた記録としてこの記事を残しました!!全ての機能までは記事にできなかったのですが、参考にしていただけますと幸いです。
【オンライン上で簡単にJava23を動かせる環境】
では、早速触ってみましょう!!
ツール
JEP 467: Markdown Documentation Comments
ドキュメントを翻訳すると、このようなことが記載されていました笑
今までの /** */ で書かなくてもよくなり、マークダウン形式で記載できるそうです。
具体的には『///』で開始して下記のようにして記述ができるようです!!
/// # Hello Class
///
/// This class serves as a demonstration of Markdown-enabled Javadoc comments.
///
/// ## Features
/// - Uses **Markdown** for formatting.
/// - Simplifies writing and improves readability.
///
/// ## Example Usage
/// ```java
/// Hello hello = new Hello();
/// hello.greet();
/// ```
///
/// @author Your Name
/// @version 1.0
/// @since 1.0
///
public class Hello {
/// Prints a greeting message to the console.
///
/// **Usage:**
/// ```java
/// hello.greet();
/// ```
///
public void greet() {
System.out.println("Hello, world!");
}
}
実際の動作確認をしてみたい時は、Java23が使用できる環境でHello.java(任意の名前の時はファイル名を置換してください)を作成して上記ソースをコピペして指定のHello.javaがある階層で下記コマンドを実行してみてください。
% javadoc -d docs Hello.java
% open docs/index.html
言語仕様
JEP 476: Module Import Declarations (Preview)
ドキュメントにはこのような記載がありました。
確かに冒頭にめっちゃ大量のimport文書いてますよね・・・
要するにモジュールごとのimportができるようです。
import module java.base;
これを冒頭に記載すれば、
java.util(List, Map, Streamなど)
java.util.stream(Collectors, Streamなど)
java.nio.file(Pathなど)
がまとめてimportされることになるそうです。
ですが、モジュール毎にまとめてimportしてしまうためコンフリクトのケアは必要です。。。。
例えば
import module java.base;
import module java.sql;
void main() {
Date nowDate = new Date();
println("Current date (java.util.Date): " + nowDate);
}
プレビュー機能なので
を使用して実行すると、下記のようなコンパイルエラーになります。
test.java:5: エラー: Dateの参照はあいまいです
Date nowDate = new Date();
^
java.sqlのクラス java.sql.Dateとjava.utilのクラス java.util.Dateの両方が一致します
test.java:5: エラー: Dateの参照はあいまいです
Date nowDate = new Date();
^
java.sqlのクラス java.sql.Dateとjava.utilのクラス java.util.Dateの両方が一致します
エラー2個
エラー: コンパイルが失敗しました
まんまなのですが、モジュール毎にまとめてimportしたため、どのモジュールのDateを使用したいのかが不明確のためコンパイルができていません。
このような場合は、下記のように記述してコンフリクトを回避するとのこと。
import java.util.List
または、
java.util.Date nowDate = new java.util.Date();
JEP 477: Implicitly Declared Classes and Instance Main Methods (Third Preview)
そうなんですよね・・・ あの"Hello Java!"で沢山書いていた呪文が書かなくてよくなるとのことです。JDK21のプレビュー機能で導入され、Java23のプレビュー機能でこんなにコンパクトに・・・!!
void main() {
println("Hello, World!");
}
これで実行すると本当に動くんですよね・・・
ちなみに、JEP477にはこんな記載がされていました。
23から新しく導入されたjava.io.IOクラスの導入により"System.out."を省略できるようになった点もコンパクトな実装を演出しています!!
確かに・・・ 最初はとりあえず呪文とだけ教わってきたけど、まさか公式がここまで辛辣とは😂笑
JEP 455: Primitive Types in Patterns, instanceof, and switch (Preview)
今回のJava23ではこのswitch式にプリミティブ型が使えるようになり、JEP 455によって、instanceofは以下をサポートされることになったようです。
1:原始型のチェック
・変数が特定のプリミティブ型かどうかを確認できる。
2:型キャストの簡略化
・条件を満たす場合、自動的にキャストされる。
公式ドキュメントを訳すとこんな文言がありました!!
なので・・・
instanceofの後にキャストを行なっていたのが、今回のプレビュー機能で型判定とキャストが組み合わさったってことですね😳!!
// Object型からInteger型に自動キャストされる
Object value = 42; // ここの値を変えて動かしてみる
String result = switch (value) {
case int i -> "Integer型: " + i;
case double d -> "Double型: " + d;
case long l -> "Long型: " + l;
default -> "上記に該当しない型です";
};
println(result);
よかったら冒頭のリンク(playground)でスグに動かせるので試してみてください!!
Java14からはswitch式になったため、break文が不要になっていました。
今年のほとんどはJava8で実装してたのも相まってか、あまりswitch文も使ってこなかったのですがbreakのデフォルトになって、ここまでコンパクトになり、全ての型で使えるようになったのであれば是非使ってみたいな・・・!!って思いました😂
ちなみに、Java8はswitch式すら導入されていないので差分比較用に実装するとこんな感じかと思われます🤔
Java23のプレビュー機能で実装と比較すると倍近くなりました笑
Object value = 42; // ここの値を変えて動かしてみる
String result = "";
if (value instanceof Integer) {
int i = (Integer) value;
result = "Integer型: " + i;
} else if (value instanceof Double) {
double d = (Double) value;
result = "Double型: " + d;
} else if (value instanceof Long) {
long l = (Long) value;
result = "Long型: " + l;
} else {
result = "上記に該当しない型です";
}
System.out.println(result);
最後に
今、開発しているアプリケーションもやっとバージョンアップしてJava21になったのでモダンなJavaをフル活用して実装していけるように、もっと色々な情報をキャッチアップして動かしみようと思います!!
ここまでお付き合いいただきありがとうございました🙇
ドキュメント/参考記事
【公式】
https://blogs.oracle.com/oracle4engineer/post/the-arrival-of-java-23-ja
【参考記事】
Marvelが少しでも気になった方は是非Wantedlyもご覧ください🙌