SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

【最新Javaアップデート解説】変更点と過去バージョンからのおさらい

「Java19」は何が新しいのか? 注目すべき新機能とJava17以降の変更点を解説

Java19での新しいAPI、変更点とJava17からのおさらい 第1回


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

 Java17(LTS)バージョンが昨年9月にリリースされ、そして、1年後のJava21(LTS)バージョンの中間点となるJava19がリリースされました。そこで、今回は、次のLTSバージョンを見据えたJava18、Java19の変更点を中心に紹介します。

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

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の内容について紹介します。

表1:Java18、Java19で追加・変更された主な機能・言語仕様
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を起動時に指定してください。

[リスト1]文字コードをJava17以前と同じ動作にする
-Dfile.encoding=COMPAT

 また、file.encodingには、UTF-8とCOMPAT以外の値については特に規定はありませんが、Java17以前で機能していた場合には、Java18以降でも同じように動作するようです。しかし、明確にサポートをうたっているわけではないので、頭の片隅にその点は置いておいたほうが良さそうです。

簡易Webサーバ

 Java18からjwebserverという簡易なWebサーバ機能が追加されました。あくまで簡易な用途であり、本番運用を前提としたものではありません。CGI機能やServletのような機能もなく、簡易的な開発時のツールやテストとして利用することを前提としています(つまり、TomcatやJettyのようなJavaコードを実行するためのコンテナ機能はありません)。

 起動はリスト2のようにjwebserverというコマンドのみで起動可能です。この場合には8080ポートが利用され、ドキュメントルートとしては起動したフォルダが利用されます。

[リスト2]jwebserverの起動方法
./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(ドキュメントルート)で指定できます。

[リスト3]jwebserverの起動方法
./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のように記述することが可能です。

[リスト4]JavaDocでのsnippetコードの埋め込み方法(src/main/java/src/jp/enbind/jep413/SampleCode.javaの抜粋)
/**
* {@snippet :
*      SampleCode obj = new SampleCode();
*      obj.sample1();
* }
*/
public void sample1(){
}

 実際に記述するコードが長い場合には外部ファイルにすることもでき、その場合には、リスト5のように記述します。fileプロパティでは外部ファイルを指定します。そして、regionプロパティではファイル内のコード場所を指定することができます。また、fileプロパティの代わりにclassプロパティでクラス名も指定することができます。

[リスト5]JavaDocでのsnippetコードの埋め込み方法(src/main/java/src/jp/enbind/jep413/SampleCode.javaの抜粋)
/**
* {@snippet
*      file="jp/enbind/SnippetJep413.java" region="sample2"
* }
*/
public void sample2(){
}

 実際の外部ファイルのコード例がリスト6です。

[リスト6]JavaDocでのsnippetコードの埋め込み用外部ファイル(src/snippet/java/src/jp/enbind/SnippetJep413.java)
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で埋め込むコードのフォルダの位置を指定します。

[リスト7]JavaDocコマンドの実行例
$javadoc -d build/docs/javadoc --snippet-path src/snippet/java src/main/java/jp/enbind/jep413/*.java

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
Switchでのパターンマッチ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
【最新Javaアップデート解説】変更点と過去バージョンからのおさらい連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/16512 2022/10/18 11:18

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング