よければシェアお願いします!
つい先日Java 17がリリースされました。
巷では商用利用が無料になったという話のほうが取り上げられていてJava言語そのものの情報が少なかったので記事にしてみました。
Java言語の変更点
JEP 409: https://openjdk.java.net/jeps/409
今回のアップデートではSealed Classesが正式にリリースされました。
昨年の9月時点でSealed Classes自体はプレビュー機能として導入されていたのがリリースされた形になります。また仕様自体はJava 16での更新で一度リファインメントされたもの(JEP397)がそのままファイナライズされたらしくJava 16のSealed Classesとは何も変更されていないようです。
Sealed Classesって何ぞや?という人にざっくり説明すると、シールはクラスやインターフェイスのアクセスを制限する修飾子です。
final 修飾子の緩和されたバージョンといったほうがピンと来るかもしれません。
例えば ShapeクラスにSealed修飾子をつけるとpermits句の後ろに指定されているクラスのみが、このShapeクラスを継承することが出来ます。(今回だとCircle,Square,Rectangleの3つ)
また Java17のプレビュー版ではSwitch文にシールクラスを適用できるみたいです。(詳しくは不明)
※ ここでpermitされていないクラスでShapeを継承しようとするとコンパイルエラーが出ます
public sealed class Shape permits Circle, Square, Rectangle{
}
このとき sealedされたクラスを継承したクラスには3つの選択子があります。
- スーパークラスと同じように特定のクラスのみ継承できるようにする
- どのクラスも継承できるようにする
- どのクラスも継承できないようにする
1. スーパークラスと同じように特定のクラスのみ継承できるようにする
これはスーパークラス(今回だとShapeクラス)と同じようにsealed修飾子とpermit句をつけることでサブクラスの継承を制御することができます。
public sealed class Circle extends Shape permits ClassA , ClassB {
}
2.どのクラスも継承できるようにする
これはnon-sealed修飾子をつけるだけです。これを付けると普通のクラスのようにどのクラスからも継承することが出来ます。
public non-sealed class Square {
}
3.どのクラスも継承できないようにする
この場合はclassに修飾子finalを付けることで継承を禁止することができます。
public final class Rectangle {
}
簡単な使い方は以上です。
JDK14で追加されたrecordと非常に相性がいいらしいのでいつか試してみたいと思います
ライブラリの更新と改善点
JEP306: Java1.2以降提供されていたstrictfpの削除
JEP356: 議事乱数ジェネレーターの新たなタイプのインターフェイスと実装
JEP382: Apple Metal APIによりmacOS用のJava 2Dパイプラインを実装
新しいプラットフォームのサポート
JEP 391:macOS AArch64 Port – 新しいAppleSiliconコンピュータ上でJavaアプリケーションをネイティブに実行できる
削除と非推奨
JEP 398: Java9で非推奨となったApplet APIが廃止予定
JEP 407: RMIアクティベーションの削除
JEP 410: JavaベースのAOTとJITコンパイラの削除(JDK16ですでに削除されている。今回はJDKのソースコードからこれらのコンポーネントが削除される)
JEP 411: Security Managerの削除に向けた非推奨
参考文献:
(Oracle、Java17をリリース) https://www.oracle.com/jp/news/announcement/java17-jp-2021-09-17/ 2021/10/01 閲覧
(Oracle Help Center Java言語更新) https://docs.oracle.com/javase/jp/15/language/sealed-classes-and-interfaces.html 2021/10/01 閲覧
コメント