ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

Java22 無名変数など

2024-03-22 22:14:54 | PG(Java)

2024/3/19にJava22が出たので、例によって調査

今回の目玉は無名変数
tryで「_」が使えるようになったのは嬉しい。

それと、複数ファイルソースコードの実行
単一のソースファイルをjavaコマンドで直接実行することは以前から出来ていたけど、今回、複数のソースファイルを参照してくれるようになった。
(ちなみに単一のソースファイルから直接実行って、Java11からだったんだなぁ。もっと最近かと思ってた^^;)

それと、一部の人にとって待望のForeign Function & Memory APIがついに正式版になったようだ。
自分個人としては使う機会があるかどうか分からないけど^^;


Java22ではプレビュー版の機能がかなり多い。

しかも、今回新しく追加になったプレビュー版機能もなかなか期待大。

  • super()・this()の前に文を書けるようになる
    • ちょくちょくコンストラクターのsuper()の前に計算式を書きたいことがあるので、とても嬉しい。
  • Stream Gatherersクラス
    • Streamの終端処理のcollectメソッドのように、中間処理用のgatherメソッドが新設される。そこに渡すのがGatherersクラスのメソッド。ウィンドウ処理は欲しかった人が居そう。
  • Class-File API
    • JavassistやASM・BCELでclassファイルをいじっていたのを、標準APIで用意するらしい。ちょっと試してみたいが、いまいち使い方が分からないorz

(翌日追記)
Class-File API使ってみた。なかなか楽しいw


Java21 getLast(), case null

2023-09-24 20:43:16 | PG(Java)

2023/9/19にJava21が出たので、例によって変更点を調査。
真面目な見どころはきしださんさくらばさんのサイトで見てもらうとして、自分が今回の目玉だと思った機能は。

なんと言っても、Listに getFirst() や getLast() が追加になったことですね!
今まで末尾要素を取得するには、list.get(list.size() - 1) というちょっとくどいコードを書く必要がありましたからね。
先頭要素の取得も、list.get(0) より list.getFirst() の方が意図が分かりやすいし。
LinkedHashSetやLinkedHashMapでも同様に先頭・末尾が取得できるのは便利。

それから、ようやくswitchで case null が書けるようになりましたね!
これ、JDK1.5(Java5)でswitchに列挙型が書けるようになった頃から欲しかった…。

switchでデータ型のマッチングが出来るようになったのも嬉しい。普通の人はあまり使わないかもしれないけど、Embulkプラグインのように色々なデータ型を処理するツールを作るときは、これがあるととても捗る。Java11にあったら使いまくったんだけどなぁ。

ちなみにswitchといえば、レコードのパターンマッチングとかにプレビュー版にはあったけどJava21の正式版には無い機能があってハマったorz
まさかプレビュー版から機能が削られることがあるとは思わなかった…。

あとはプレビュー機能でも文字列テンプレート(文字列補間)とか無名変数とかmainメソッド簡略化とか面白いものが増えてるけど、これらはいずれ正式機能になった時に。

面白いと言えば、Characterクラスに追加になったisEmojiメソッドかな。「emoji」って英語なのか?!^^;


Java20 ClassFileFormatVersion

2023-03-22 21:15:07 | PG(Java)

2023/3/21にJava20が出たので、新機能をメモ

きしださんのJava 20新機能まとめによると、今回はJEP429 Scoped Valuesが追加になった程度で、大きな修正は無いらしい。

とはいえ、レコードのパターンマッチングに拡張for文(for each構文)が対応したというは、ちょっと驚いたw

それから、リフレクション関連で地味にAccessFlagという列挙型が追加されていた。
今までpublicやstaticといった修飾子はModifierというクラスの整数値の論理和で表していたけど、それの列挙型版w

さらに驚いたのは、新設されたClassFileFormatVersionという列挙型。
今まで、「Javaのバージョン」と「classファイルのバージョンの数値」を対応付ける方法が分からん…と言っていたんだけど、今さらそれが分かるクラスが追加になるとはw

(追記)
javacの--releaseで7が指定できなくなった(Java7のコンパイルが出来ない)。
それと、8を指定すると警告が出るようになった。いよいよJava8の廃止が見えてきたのか…Asakusa FrameworkはいまだにJava8なんだけどな^^;


Java19 レコードパターン 仮想スレッド

2022-09-25 18:06:47 | PG(Java)

2022/9/15にドラクエ10オフラインが発売されて忙しい最中の9/21にJava19が出たわけですよ^^;

一番話題をさらったのはBigDecimalにTWOという定数が加わったことのようですが(爆)

目新しい機能はプレビュー版ばかりですね。

  • switchパターンマッチング…ガードの記号が&&からwhenに変わった
  • レコードパターン…recordのパターンマッチが出来る。意外と高機能w
  • 仮想スレッド…Javaの軽量スレッド。使い方は既存のThreadとほとんど変わらないのがすごい。ExecutorServiceで軽量スレッドを使う方法は分かったけど、ForkJoinで使う方法が分からないorz
    • 地味にExecutorServiceがAutoCloseableを実装して、try文で使えるようになった
  • Structured Concurrency(インキュベーター)…構造化された並列性制御?仮想スレッドと関係あるらしい
  • Foreign Function & Memory API…インキュベーターからプレビューに変わった。なかなか正式にならない^^;

そんじゃパラディンに転職してくる。はぁー忙しい忙しい。


Java18 デフォルトのキャラセットがUTF-8になった

2022-03-23 19:27:00 | PG(Java)

Java18が出たので、例によって調査。

今回一番大きいのは、デフォルトのキャラセット(ファイルのエンコーディング)がUTF-8になったことでしょう。
今までは環境依存(WindowsならMS932)だったので。
ただ、主に影響を受けるのは旧来のInputStreamReaderやOutputStreamWriterを使ってファイルを読み書きするときであって、nio2(PathやFiles)は最初からデフォルトはUTF-8でファイルを読み書きするようになっているから、あまり関係ない(はず)だけど^^;