Java17までの簡単なおさらい
かなり時間があきましたが、前回、Java12からJava15についてはこちらで紹介しました。ここで大きく影響があったProject Amberプロジェクトの機能を中心にJava16、Java17において正規版としてリリースされました。
それ以外で紹介できなかったものとしては、Apple CPU(M1/M2)に正式に対応したJavaのリリースがありました。筆者もM1チップ上で動くJava上で開発をしています。
そして、筆者としては気になる機能としてUnix-Domainに対応したSocket Channelsがありました。ただし、UnixDomainのソケット機能が必須となるシステムを作る開発者は少ないと思われます。そして、同様の機能はサードパーティー製のオープンソースライブラリでJNIとして実装されているものもあるので、直接的に関心がある開発者は少ないとは思います。
Java17以降の変更(Java18と19の概要)
Java18、Java19ではProject Amberプロジェクトの残りの機能と、環境を含めた軽微な修正が中心と言えます。そのほかにもいくつかの新機能や変更点があり、その中から今回はプレビュー版としてもリリースされたものも含め、その中でも開発者にとって影響が比較的大きな変更である表1の内容について紹介します。
JEP | 名称 | リリースされたバージョン |
---|---|---|
JEP400 | 標準APIのデフォルト文字コードがUTF-8になる | Java18 |
JEP408 | 簡易Webサーバ | Java18 |
JEP413 | JavaDoc用のコード例の埋め込み表記方法の改善 | Java18 |
JEP420,JEP427 | Switchでのパターンマッチ | Java19(プレビュー版) |
JEP425 | 仮装スレッド | Java19(プレビュー版) |
JEP421 | Finalizeメソッドの無効化 | Java18 |
標準APIのデフォルト文字コードがUTF-8になる
Javaではこれまで利用するOS毎にデフォルトの文字コードが異なっていました。例えば、LinuxやMacではUTF-8でしたが、WindowsではShift_JIS(正確にはMS932)でした。これが、すべてUTF-8に統一されます。
ただし、これまでの動作と同じようにするには、リスト1のようにfile.encodingを起動時に指定してください。
-Dfile.encoding=COMPAT
また、file.encodingには、UTF-8とCOMPAT以外の値については特に規定はありませんが、Java17以前で機能していた場合には、Java18以降でも同じように動作するようです。しかし、明確にサポートをうたっているわけではないので、頭の片隅にその点は置いておいたほうが良さそうです。
簡易Webサーバ
Java18からjwebserverという簡易なWebサーバ機能が追加されました。あくまで簡易な用途であり、本番運用を前提としたものではありません。CGI機能やServletのような機能もなく、簡易的な開発時のツールやテストとして利用することを前提としています(つまり、TomcatやJettyのようなJavaコードを実行するためのコンテナ機能はありません)。
起動はリスト2のようにjwebserverというコマンドのみで起動可能です。この場合には8080ポートが利用され、ドキュメントルートとしては起動したフォルダが利用されます。
./jwebserver Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::". Serving /Users/enbindjp/webroot and subdirectories on 127.0.0.1 port 8888 URL http://127.0.0.1:8080/
ポートとドキュメントルートを指定する場合には、リスト3のように-p(ポート)と-d(ドキュメントルート)で指定できます。
./jwebserver -p 8888 -d $HOME/webroot Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::". Serving /Users/enbindjp/webroot and subdirectories on 127.0.0.1 port 8888 URL http://127.0.0.1:8888/ 127.0.0.1 - - [29/8月/2022:20:41:25 +0900] "GET / HTTP/1.1" 200 -
JavaDoc用のコード例の埋め込み表記方法の改善
JavaDocに簡単なサンプルコードなどを埋め込むことがより簡単にできるようになりました。これまでは、<code>タグを記述して書く必要がありましたが、Java18からは、リスト4のように記述することが可能です。
/** * {@snippet : * SampleCode obj = new SampleCode(); * obj.sample1(); * } */ public void sample1(){ }
実際に記述するコードが長い場合には外部ファイルにすることもでき、その場合には、リスト5のように記述します。fileプロパティでは外部ファイルを指定します。そして、regionプロパティではファイル内のコード場所を指定することができます。また、fileプロパティの代わりにclassプロパティでクラス名も指定することができます。
/** * {@snippet * file="jp/enbind/SnippetJep413.java" region="sample2" * } */ public void sample2(){ }
実際の外部ファイルのコード例がリスト6です。
class Jep413Test() { public static void main(String[] args) throws Exception { // (1) regionの指定 // @start region="sample2" SampleCode obj = new SampleCode(); obj.sample2(); // @end // (2) 終了 } }
(1)で先ほど指定したregionと同じ値で埋め込むコードの最初と(2)のように埋め込む位置の終了を指定します。また、埋め込む外部コードは通常とは別のフォルダにあることが多いでしょう。その場合には、javadocコマンドを実行する際にリスト7のように--snippet-pathで埋め込むコードのフォルダの位置を指定します。
$javadoc -d build/docs/javadoc --snippet-path src/snippet/java src/main/java/jp/enbind/jep413/*.java