2026/09/15

JEPでは語れないJava 27

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

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

Java 27はLTSの間の中間のバージョンからか導入された機能も裏方的なものが多く。APIの変更も少ししかありません。まぁ、そんなもんです。

Java 27のStandard JEPは4つ。

  • JEP 523: Make G1 the Default Garbage Collector in All Environments
  • JEP 527: Post-Quantum Hybrid Key Exchange for TLS 1.3
  • JEP 534: Compact Object Headers by Default
  • JEP 536: JFR In-Process Data Redaction

Preview JEPとIncubator JEPは5つ。

  • JEP 531: Lazy Constants (Third Preview)
  • JEP 532: Primitive Types in Patterns, instanceof, and switch (Fifth Preview)
  • JEP 533: Structured Concurrency (Seventh Preview)
  • JEP 537: Vector API (Twelfth Incubator)
  • JEP 538: PEM Encodings of Cryptographic Objects (Third Preview)

Java 26のJEPが10でしたから、さらに減っています。

Standard JEPでは、JEP 523とJEP 534がヒープに関するもの。どちらもデフォルト動作が変更されるというものです。

JEP 527とJEP 536はセキュリティ関連ですね。

 

Preview JEPとIncubator JEPは新規はなし。一番少ないものでも3回目のPreviewなので、新規性はないです。

JEPについての詳細は別エントリーで。

 

さて、JEPで語れない方です。Java 27はAPIの変更も少なめ。ほとんどがjava.baseモジュールなので、今回はjava.baseモジュールだけです。

なお、今回もセキュリティ関連や、バージョンに関する定数については省略です。

 

廃止になったAPI

Java 27で削除されたAPIは、メソッドが1つだけです。

メソッド

スレッドプールを提供するExecutorServiceインタフェースのコンクリートクラスであるThreadPoolExecutorクラスのメソッドが1つだけ削除されました。

  • java.util.concurrent.ThreadPoolExecutor.finalize()

基本的にfinalize()メソッドは使わないようにすべきです。ThreadPoolExecutorクラスが実装しているExecutorServiceインタフェースがAutoClosableインタフェースのサブインタフェースになっているため、なおさらfinalize()メソッドは必要ないですね。

もし、finalize()メソッドを使用しているようであれば、try-with-resources構文を使用するようにしましょう。

 

 

廃止予定に追加されたAPI

Java 27で、forRemoval=trueになったAPIはありません。

 

追加されたAPI

Java 27ではStandard JEPでのAPI変更がないので、全体的にAPIの変更も少ないです。

 

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

数値演算のメソッドが追加されているのがメインですね。

 

Math/StrickMathクラス

逆双曲線関数関連のメソッドが3つ追加されました。

  • double acosh(double x)
  • double asinh(double x)
  • double atanh(double x)

メソッド名の通り逆双曲線余弦関数、逆双曲線正弦関数、逆双曲線正接関数を求めるためのメソッドです。

 

Stringクラス

文字列をエンコードした時の文字列サイズを求めるメソッドが追加されました。

  • int encodedLength(Charset cs)

Javaは内部文字セットとしてUTF-16を使用しているので、String.length()メソッドではUTF-16のサイズを返します(文字列長ではないです)。これに対し、指定した文字セットでエンコードしたバイト列のバイト長を返すのがencodedLength()メソッドです。

 

jshell>  var text = "こんにちは"
text ==> "こんにちは"

jshell> text.length()
$2 ==> 5

jshell> text.encodedLength(Charset.forName("UTF-8"))
$3 ==> 15

jshell> text.encodedLength(Charset.forName("Shift_JIS"))
$4 ==> 10

jshell> 

内部的にはgetBytes(cs).lengthをコールしているのと同等になります。

 

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

Classfile APIのオペコードに対応するインタフェースにメソッドが追加されました。

 

IncrementInstructionインタフェース

IncrementInstructionインタフェースは、オペコードのiincとiinc_wに対応するインタフェースです。

これまでもファクトリーメソッドであるof()メソッドが提供されていましたが、of()メソッドがオーバーロードされました。

  • static IncrementInstruction of(Opcode op, int slot, int constant)

これまでのof()メソッドはオペコードを指定することができませんでしたが、オーバーロードされたof()メソッドはオペコードが指定できます。

指定できるオペコードはOpcode.IINCもしくはOpcode.IINC__Wです。

 

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

FFMのメモリに関するインタフェースにメソッドが追加されました。

 

MemorySegmentインタフェース

FFMでメモリ領域に対応するMemorySegmentインタフェースにメソッドが2つ追加されました。

どちらも既存のメソッドのオーバーロードになっています。

 

  • static long copy(String src, Charset dstEncoding, int srcIndex, MemorySegment dst, long dstOffset, int numChars)
  • String getString(long offset, Charset charset, long byteLength)

既存のcopy()メソッドは、MemorySegmentからMemorySegmentへのコピーでした。これに対し、新しいcopy()メソッドは文字列をMmoerySegmentにコピーします。

一方のgetString()メソッドはバイト長を指定できるようになりました。

 

SegmentAllocatorインタフェース

メモリーのアロケートを行ってMemorySegmentオブジェクトを返すのがSegmentAllocatorインタフェースです。

こちらも、メソッドのオーバーロードが追加されました。

 

  • MemorySegment allocateFrom(String str, Charset charset, int srcIndex, int numChars)

ソースとなる文字列の開始インデックスと文字数を指定できるようになりました。

 

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

BigDecimalクラスにメソッドが1つ追加されました。

 

BigDecimalクラス

意外にもn乗根を求めるメソッドが今までなかったのでした。BigIntegerクラスはJava 26でn乗根を求めるメソッドが追加されたので、それに続く変更になります。

 

  • BigDecimal rootn(int n, MathContext mc)

第2引数のMthContextクラスは精度を指定するためのクラスです。

 

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

Date & Time APIのフォーマッターに関するクラスが新規で導入されました。

 

DateTimeFormatterPatternProviderクラス

DateTimeFormatterPatternProviderクラスロケールごとに日時フォーマットを文字列を作成するためのクラスで、LocaleServiceProviderクラスのサブクラスです。

DateTimeFormatterPatternProviderクラスも抽象クラスであり、アプリケーションごとに以下のメソッドをオーバーライドします。

 

  • String getDateTimeFormatterPattern(String requestedTemplate, String calType, Locale locale)
  • String getDateTimeFormatterPattern(FormatStyle dateStyle, FormatStyle timeStyle, String calType, Locale locale)

 

その他の変更

Java 27というわけではありませんが、2026年8月からOracleがセキュリティアップデートの変更を行いました。

今までのセキュリティアップデートはCPU (Critical Patch Update)といい、1月、4月、7月、10月に行われてきました。

これに対し、新たにCSPU (Critical Security Patch Update)が追加され、2月、3月、5月、6月、8月、9月、11月、12月に行われます。

CPUとCSPUを合わせると、毎月セキュリティアップデートがあることになります。

すでに、2026年8月にはCSPUに対応するJava 26.0.2.1がリリースされています。今までのCPUが3つ目の数字で、CSPUが4つ目の数字ということになったようです。

これはOracle JDKの話ですが、結局は他のディストリビューターも追従するようですね。

 

参考: 月次のCritical Security Patch Updates (CSPUs)を2026年5月28日より開始

 

 

まとめ

LTSの間の中間のバージョンだからなのか、変更点がとても少ないです。

JEPによる変更も少ないのですが、これに関しては次のエントリーで紹介します。

 

次のJava 28は、やっとValue ClassがPreviewになります。これ以外にもプリミティブ型のパターンマッチングなどがStandard JEPになりそうなので、いろいろ動きがありそうです。

Java 27は嵐の前の静けさなのかもしれません。

0 件のコメント: