^-----------------------------------^jshell>ShapeクラスはCircleクラスとRectangleクラスのみ派生できるように定義したので、それ以外のTriangleクラスを派生させようとしてもコンパイルエラーになります。こんな機能が必要かというと、今後導入されるswitch式でのパターンマッチングなどに使えるからです。派生クラスが制限されていれば、default句が必要なくなるからです。classなのは、Circleクラスをさらに派生させたクラスを作成できてしまうとsealする意味がなくなってしまうからです。classにすることはできます。Classかどうかを調べるクラスだということはすぐにわかりますね。falsejshell>ShapeクラスはisSealedメソッドでtrueが返りますが、Circleクラスはfalseになります。Classを派生できるクラスの一覧を返すメソッドです。Classではない普通のクラスでpermittedSublassesメソッドをコールすると、空の配列が帰ります。Classを使うことはあっても、普通はpermittedSubclassesメソッドを使わないでしょうけど。Mathクラス/StrickMathクラス2つのクラスとも同じメソッドが追加されました。a)どちらも実装は同じです。普通のabsと何が違うかというと、引数がMIN_VALUEの時にArithmeticException例外がスローされるというところです。12で追加されたcondy関連のパッケージですが、このパッケージのクラス群もよっぽどのことがないかぎり使わないと思います。追加されたところだけさらっと流します。ConstantDescsクラスConstantDescsクラスはプリミティブ型などの定数に対するXXXDescを示す定数が定義されているクラスです。そこに、4種類の定数が追加されました。Classに関するAPIが追加されています。ConstantBootstrapsクラス削除されたAPIのところで、コンストラクタが削除されたと書いたConstantBootstrapsクラスです。Classとは関係ないメソッドが追加されています。ConstantDescsクラスで追加された定数に対応するメソッドです。value)ようするにキャストをcondyで行う時のブートストラップです。これはMethodHandleクラスを使えば記述できるのですが、それを簡単に書けるようにしただけのメソッドです。MethodHandles.LookupクラスLookupクラスはindyやcondyでメソッドなどをルックアップするためのfindXXXメソッドを定義しています。他にラムダ式のように動的に生成したクラスを定義するためにdefineClassメソッドなどがあります。Class関連で追加されています。Class版がdefineHiddenClassメソッドです。Classはその名の通り隠されたクラスなので普通のクラスとはいくつかの違いがあります。匿名クラスと違って名前があるとか、リフレクションでしかアクセスできないなどです。初期化は第2引数がtrueの場合にしか行いません。後から初期化を強制的に行うようにするのが、ensureInitialziedメソッドです。返り値が初期化を行ったClassオブジェクトになります。いうものの、これらのメソッドを使うことはないだろうなぁ...MethodHandles.Lookup.ClassOption列挙型LookupクラスのdefineHiddenClassメソッドで使用するenumが新規追加されました。定義している定数は次の2種類です。Classを扱うために使います。STRONGはクラスローダーと強い関係を持たせる場合です。Classもアンロードされるということらしいです。java.base/java.lang.reflectパッケージjava.lang.reflectパッケージはリフレクションに関する情報を扱うために使用します。AnnotatedTypeインタフェースAnnotatedTypeインタフェースはアノテーションで修飾された型の情報を扱うためのインタフェースですが、メソッドが3つ追加されました。getDeclaredAnnotation()これらのメソッドはデフォルトメソッドではなくて、普通のメソッドです。思うかもしれませんが、まったく問題ありません。いうのも、これらのメソッドはAnnotatedTypeインタフェースの親インタフェースのAnnotatedElementインタフェースで定義されているメソッドだからです。それを、なぜ今さらAnnotatedTypeインタフェースに定義しなおしたんですかねぇ。🤔java.base/java.nioパッケージjava.langパッケージのサブパッケージは普通の開発者は、まず触れないパッケージでしたけど、ここからは使うかもしれないパッケージです。CharBufferクラスBufferクラスのサブクラスはいろいろありますが、その中のCharBufferクラスだけメソッドが追加されました。isEmpty()StringクラスのisEmptyメソッドはlengthが0かどうかをチェックしますが、CharBufferクラスはちょっと違います。remainingが0かどうかをチェックします。Bufferクラスのremainingはpositionとlimitの間にある要素数なので、読み込みを行った後、残りが空かどうかを調べるという使い方になります。jshell>CharBufferオブジェクトをアロケートしただけで、中身は空だとしても$3のようにisEmptyメソッドはfalseを返します。この時、positionは0、limitは10だからです。結局、最後に示したようにpositionを10に進めると、isEmptyメソッドがtrueを返します。ほんとに文字があるかどうかではないので、注意が必要です。java.base/java.nio.channelsパッケージNIOのチャネルもメソッドが追加されています。SocketChannelクラスソケットチャネルにオープンのメソッドが追加でオーバーロードされました。family)引数の型のjava.net.ProtocolFamilyインタフェースはプロトコルのファミリーを表すわけですが、このままだとなんだかよくわかりません。実際に使用するのはProtocolFamilyインタフェースを実装したStandardProtocolFamily列挙型です。このenumではINETとINET6という定数が定義されています。ようするに、IPv4かIPv6かということです。今までSocketChannelクラスでは、使用されているIPアドレスによってIPv4とIPv6を自動的に使い分けていたのですが、新たにオーバーロードされたopenメソッドはそれを明示的に行うということです。ServerSocketChannelクラスServerSocketChannelクラスもopenメソッドがオーバーロードされています。family)返り値の型が違うだけで、SocketChannelクラスと一緒ですね。java.base/java.nio.channels.spiパッケージjava.nio.channels.spiパッケージはNIOのチャネルのプロバイダを定義しているパッケージですが、ここでもProtocolFamilyインタフェースに関連するメソッドが追加されました。SelectorProviderクラス通信を多重化して扱うSelectableChannelクラスのプロバイダがSelectorProviderクラスです。追加されたのは、SocketChannel/ServerSocketChannelクラスで追加されたopenメソッドと同様のメソッドです。cause)java.compiler/javax.lang.modelパッケージ毎度毎度のjavax.lang.modelパッケージです。15に対応する定数が追加されました。RELEASE_15java.compiler/javax.lang.model.elementパッケージjava.compilerモジュールなので、普通の開発者はまず使わないとは思いますが...Elementインタフェースjavax.lang.reflectパッケージのAnnotatedTypeインタフェースが変更されたのと同じく、Elementインタフェースもアノテーション関連のメソッドが追加されました。Classesに関する定数が2つ追加されました。NON_SEALEDSEALEDTypeElementインタフェースTypeElementインタフェースはクラスもしくはインタフェースに関する要素を取得するために使用するインタフェースです。Classで派生することが許されているクラスの一覧を取得するメソッドが追加されています。APIが追加されています。16で正式なAPIになると思います。Interface関連はいろいろとおもしろいので、機会があれば取り上げてみようと思います。Class関連とjava.nio.CharBufferクラスのメソッド追加ぐらいなのがちょっと寂しいですね。