2026/03/17

JEPでは語れないJava 26

このエントリーをはてなブックマークに追加

毎度おなじみ半年ぶりのJavaのアップデートです。

Java 26はLTSの次のバージョンということで、新機能も少なめ。APIの変更も少ししかありません。まぁ、そんなもんですね。

Java 26のJEPの一覧はこちら。

  • 500: Prepare to Make Final Mean Final
  • 504: Remove the Applet API
  • 516: Ahead-of-Time Object Caching with Any GC
  • 517: HTTP/3 for the HTTP Client API
  • 522: G1 GC: Improve Throughput by Reducing Synchronization
  • 524: PEM Encodings of Cryptographic Objects (Second Preview)
  • 525: Structured Concurrency (Sixth Preview)
  • 526: Lazy Constants (Second Preview)
  • 529: Vector API (Eleventh Incubator)
  • 530: Primitive Types in Patterns, instanceof, and switch (Fourth Preview)

 

10のJEPのうち、半分はPreviewとIncubatorです。

Standard JEPでは、JEP 500は予告のようなものでfinalは値の変更をできなくするよというもの。JEP 504はとうとうAppletのAPIが削除されるというもの。

残りの3つのStarndard JEPも、APIの変更はほとんどなし。主にパフォーマンスに関するJEPです。

Standard JEP以外のJEPも、新しいものはありません。そろそろStandard JEPになってもいいんじゃないかなぁというのもありますね。

これらのJEPに関しては、次エントリーで紹介する予定です。

 

さて、JEPで語れない方です。Java 26はAPIの変更も少なめ。

とはいうものの、java.baseモジュール以外の変更もあるので、そちらも紹介します。しかし、いつものごとくセキュリティ関連は省略させてください。

また、今回からバージョンに関する定数の追加についても省略します。

 

廃止になったAPI

Java 26ではJEP 504でアプレットに関するAPIがごそっと削除されました。

パッケージ

  • java.applet

java.appletパッケージで定義されていたインタフェース、クラスなども削除されています。

 

クラス

  • javax.swing.JApplet

Swingでアプレットを作るときに使われたJAppletクラスも削除です。

 

メソッド

アプレット関連以外にも削除されたメソッドが多いので、注意が必要です。とはいえ、finalize()メソッドなど基本的には使われていないメソッドのはず。

そして、とうとうThread.stop()メソッドも削除されました。

  • java.beans.Beans.instantiate(ClassLoader,String,BeanContext,AppletInitializer)
  • java.lang.Thread.stop()
  • java.net.DatagramSocketImpl.getTTL()
  • java.net.DatagramSocketImpl.setTTL(byte)
  • java.net.MulticastSocket.getTTL()
  • java.net.MulticastSocket.send(DatagramPacket, byte)
  • java.net.MulticastSocket.setTTL(byte)
  • javax.imageio.spi.ServiceRegistry.finalize()
  • javax.imageio.stream.FileCacheImageInputStream.finalize()
  • javax.imageio.stream.FileImageInputStream.finalize()
  • javax.imageio.stream.FileImageOutputStream.finalize()
  • javax.imageio.stream.ImageInputStreamImpl.finalize()
  • javax.imageio.stream.MemoryCacheImageInputStream.finalize()
  • javax.management.modelmbean.DescriptorSupport.toXMLString()
  • javax.swing.RepaintManager.addDirtyRegion(Applet, int, int, int, int)

 

例外

  • javax.management.modelmbean.XMLParseException

 

コンストラクター

  • javax.management.modelmbean.DescriptorSupport.<init>()

 

廃止予定に追加されたAPI

Java 26でもセキュリティマネージャーの削除に関連して、パーミッション系のクラスがforRemoval=trueになっています。

クラス

  • java.net.SocketPermission
  • java.sql.SQLPermission

 

メソッド

  • java.lang.classfile.Signature.ClassTypeSig.of
  • java.net.ServerSocket.setPerformancePreferences
  • java.net.Socket.setPerformancePreferences
  • java.net.SocketImpl.setPerformancePreferences

 

追加されたAPI

Java 25で大幅に変更されたAPIは少ないのですが、JEP 517のHTTP/3導入にともなってjava.net.httpモジュールに追加があるのが大きなところでしょうか。

また、JDBCにAPIが追加されているのが珍しいですね。

 

java.base/java.langパッケージ

Java 26ではサポートしているUnicdeのバージョンが17.0になりました。これに伴って、Characterクラス関連で定数が多く追加されています。

 

Character.UnicodeBlockクラス

Unicodeのブロックが追加されたことに対応して、定数が追加されています。

  • BERIA_ERFE
  • CJK_UNIFIED_IDEOGRAPHS_EXTENSION_J
  • MISCELLANEOUS_SYMBOLS_SUPPLEMENT
  • SHARADA_SUPPLEMENT
  • SIDETIC
  • TAI_YO
  • TANGUT_COMPONENTS_SUPPLEMENT
  • TOLONG_SIKI

 

Character.UnicodeScript列挙型

同様にスクリプトも追加されているので、対応する定数が追加されています。

  • BERIA_ERFE
  • SIDETIC
  • TAI_YO
  • TOLONG_SIKI

 

Processクラス

外部のプログラム実行に使用されているProcessクラスですが、Closeable/AutoCloseableインタフェースを実装するようになりました。

これでやっとtry-with-resources構文で使えるようになりました。

  • close()

 

Stringクラス

Unicodeのケースフォールディングに対応した比較メソッドが追加されています。

ケースフォールディングでは、アルファベットの大文字、小文字を区別しないだけでなく、ドイツ語のßとssなどを区別しません。

Latin-1の文字であればequalsFoldCase()メソッドとequalsIgnoreCase()メソッドは同じ結果を返しますが、Latin-1以外の文字で結果が異なる場合があるということですね。

定数のUNICODE_CASEFOLD_ORDERはケースフォールドに対応したComparator<String>オブジェクトです。

 

  • int compareToFoldCase(String)
  • boolean equalsFoldCase(String)
  • Comparator<String> UNICODE_CASEFOLD_ORDER

ケースフォールディングで比較するequalsFoldCaseメソッドを試してみましょう。

jshell>  "Hello, World!".equalsIgnoreCase("hello, world!")
$1 ==> true

jshell> "Hello, World!".equalsFoldCase("hello, world!")
$2 ==> true

jshell>  "ß".equalsIgnoreCase("ss")
$1 ==> false

jshell> "ß".equalsFoldCase("ss")
$2 ==> true

jshell> 

このほかにも、フランス語のŒとœなどがあります。ケースフォールディングの一覧は以下のリンクから。

CaseFoling.txt

 

java.base/java.mathパッケージ

BigIntegerクラスに演算メソッドが追加されています。

BigIntegerクラス

n乗根に関するメソッドが2つ追加されました。

  • BigInteger rootn(int)
  • BigInteger[] rootnAndRemainder(int)

rootn()メソッドはn乗根を求めるためのメソッドです。引数が2の場合はsqrt()メソッドと等価になります。

rootnAndRemainder()メソッドはn乗根と、自分自身とn乗根をn乗した数との差を配列で返すメソッドです。n乗根がrだとすると、rとthis - r**nが配列になります。こちらも、引数が2の場合はsqrtAndRemainder()メソッドと等価です。

 

java.base/java.nioパッケージ

クラスから列挙型に変更されるケースを初めて見たのですが、以前にもあったのでしょうか?

ByteOrder列挙型

ByteOrderはJava 25まではクラスだったのですが、列挙型に変更されました。これに伴い、定数の宣言が変更され、列挙型のメソッドが追加されています。

もともと、ByteOrderクラスの定数LITTLE_ENDIANとBIG_ENDIANの型はByteOrderクラスだったので、列挙型に変更してもプログラムを変更する必要はないはずです。

  • static ByteOrder valueOf(String)
  • static ByteOrder[] values()

 

java.base/java.timeパッケージ

時間間隔を表すDurationクラスに定数が追加されました。また、Instantクラスにもメソッドが追加されています。

 

Durationクラス

Durationクラスで保持できる最大時間間隔と最小時間間隔を表す定数が追加されています。なお、Durationクラスでは負の時間間隔も表せるので、最小となるのは負の値です。

  • Duration MAX
  • Duration MIN

MAXはLong.MAX_VALUEに999,999,999ナノ秒を加えた値で作成する時間間隔になります。MINの方はLong.MIN_VALUEで作成する時間間隔です。

 

Instantクラス

Instantクラスは時点を表すためのクラスです。これまで、自分自身の時点に指定された時間間隔を追加するメソッドとしてplusメソッドが使われてきました。これに対し、時間間隔を追加した結果が、InstantクラスのMAX、MINを超えてしまう場合、MAXとMINを返すplusSaturatingメソッドが追加されています。

  • Instant plusSaturation(Duration)

 

java.base/java.utilパッケージ

なぜ今さらという感じですが、Comparatorインタフェースにメソッドが2つ追加されました。

また、JEP 526 Lazy Constantに関連して、ListインタフェースとMapインタフェースにメソッドが追加されるのですが、これはpreviewなので、正式になった時に紹介します。

 

Comparatorインターフェス

2つの引数の大きい方/小さい方を返すmax()メソッド、min()メソッドが追加されました。

  • <U extends T> U max(U, U)
  • <U extends T> U min(U, U)

どういう時にこれらのメソッドを使うのか、イマイチ分からないんですよね。

 

java.desktop/java.awtパッケージ

AWTにメソッドが追加なんていつ以来でしょうか?とはいっても、GUIの機能を追加するのではなく、GUIのテストなどに使用するRobotクラスに簡易的なメソッドが追加されただけでした。

 

Robotクラス

Robotクラスは基本的な機能は追加されていないのですが、今までマウスのクリックでもmousePress()メソッドとmouseRelease()メソッドが分かれているなど、ちょっと使いにくい部分がありました。そこで、これらをもう少し分かりやすい形式でコールできるようになるためのメソッドが8種類追加されています。

  • void click()
  • void click(int)
  • void glide(int,int)
  • void glide(int,int,int,int)
  • void glide(int,int,int,int,int,int)
  • void type(int)
  • void type(char)
  • void waitForIdle(int)
  • int DEFAULT_DELAY
  • int DEFAULT_STEP_LENGTH

たとえば、click()メソッドは、mousePress()メソッド、waitForIdle()メソッド、mouseRelease()メソッド、waitFor()メソッドの4つのメソッドを順にコールしたものと同じ動作をします。

他のメソッドも、すでに存在するメソッドを組み合わせて簡単に呼べるようにしたというものです。

また、2つの定数は、たとえばclick()メソッドの内部でコールされるwaitForIdle()メソッドの初期値を表しているように、今回追加されたメソッドで使用する定数となっています。

 

java.management/javax.lang.managementパッケージ

MXBeanにメソッドが追加されました。

本来はMXBeanのインタフェースに抽象メソッドを追加したいところですが、後から追加ができないのでdefaultメソッド。default目祖度では意味のない値を返しているので、オーバーライド前提なのですが、本来であればインタフェースの変更したいところですね。

 

MemoryMXBeanインタフェース

GCのCPU時間を取得するためのメソッドが追加されました。

  • long getTotalGcCpuTime()

defaultメソッドでの実装は-1を返します。つまり、MemoryMXBeanインタフェースを実装するクラスが正しく実装しないと使えないメソッドになっています。まぁ、標準ライブラリなので、実装を忘れることはないでしょうけど。

 

java.net.http/java.net.httpパッケージ

JEP 517でHTTP/3がサポートされることになって、いろいろと変わっています。しかし、プロトコルが変わるだけなので、大きな使い方の変更はないです。

これについては、次のエントリーのJEPで語る方で紹介します。

 

java.sql/java.sqlパッケージ

JDBCのバージョンが4.3から4.5にアップしました。

一番の違いは、AutoCloseableに対応したことです。

 

Arrayインタフェース、Blobインタフェース、Clobインタフェース、SQLXMLインタフェース

これらの4つのインタフェースがすべてAutoCloseableインタフェースを実装するようになりました。これで、try-with-resources構文で使用することが可能です。

  • void close()

 

Connectionインタフェース

あまりJDBCを使うことがないので、よく分からないのですが、なぜか今ごろになってリテラルなどをクォーテーションするメソッドが追加されました。

  • String enquoteIdentifier(String,boolean)
  • String enquoteLiteral(String)
  • String enquoteNCharLiteral(String)
  • boolean isSimpleIdentifier(String)

 

JDBCType列挙型、Typesクラス

いずれも定数が2種類増えています。

  • DECFLOAT
  • JSON

 

まとめ

LTSの次のバージョンということで変更点は少ないものの、AWTやJDBCなど今まで変更の少なかったAPIに変更があったのは珍しいですね。

また、HTTP/3への変更もありますが、こちらは使い方はほとんど変わらないので、APIの変更も少なめです。これに関しては次のエントリーで紹介します。

 

さて、次のエントリーではJEPに関して簡単な説明を加えていく予定ですが... 今、さくらばは3月17日から開催されるJavaOneに参加するため、アメリカに滞在しています。そのため、JEPで語る方はJavaOneの後になりそうな予感が...

まぁ、のんびり待っていてください。

0 件のコメント: