Pleiades Eclipse 2020-03 リリース 〜 Java 14 新機能を試そう！

Pleiades All in One Eclipse 2020-03 をリリースしました。現在の Java 11 LTS から 2021 年の Java 17 LTS の移行に向けて、新機能を試しておきましょう。Pleiades All in One の Java Full Edition は解凍するだけで、Java のインストールや環境変数の設定が不要で Eclipse の各種設定も自動で行われるため、すぐに日本語化された Eclipse で Java 14 を利用できます。

**Pleiades All in One ダウンロード**
http://mergedoc.osdn.jp/
![splash.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45147/1ac4c1cc-3e6f-adc6-a867-79a233dfca48.png)

# Java 14 プロジェクトの作成

デフォルトで設定済みの Java 6, 7, 8, 11, 14 から 14 を選択するだけです。
Java のダウンロードやインストール・パス設定などは不要です。
<img width="600" alt="create_project.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45147/fb88b833-bcb3-e638-27c2-7f17a9d5fa08.png">

標準ではないプレビュー機能を使用する場合は、プロジェクトのプロパティーを設定します。
プロジェクト > 右クリック > プロパティー
![java14_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45147/28b5b29b-dbe1-3fbc-7af2-ec0effba05d8.png)

### Java コードテキストの貼り付け便利機能

これは昔からある機能なのですが、パッケージ・エクスプローラーのツリーの src 配下にファイルではなく、Java のソースコードテキストを直接貼り付けるだけで、以下の動作となり楽ちんです。右クリして 新規 > クラス > ダイアログ とか不要です。

* 貼り付けたテキストの class 宣言に合わせて .java ファイルが作成される
* 貼り付けたディレクトリ位置に合わせて package 宣言を書き換えてくれる
* エディターが開く

# Java 14 新機能

switch、レコード、テキストブロック、パターンマッチのサンプルコードです。
貼り付けて試しやすいように 1 クラスにしています。

```java
import static java.lang.System.*;
import java.time.Month;

class Demo {

	public static void main(String[] args) {

		//--------------------------------------------------
		// switch (Java 14 標準)
		{
			// 複数ラベル - 結果: "Hello\nWorld\n"
			var i = 1;
	    	switch (i) {
				case 0, 1, 2: out.println("Hello");
				default :  out.println("World");
			}
		}
		{
			// アロー - 結果: Hello
			var i = 2;
	    	switch (i) {
	    		case  2 -> out.println("Hello");
	    		default ->  out.println("World");
			}
		}
		{
			// switch 式 - 結果: 大の月
			var month = Month.MARCH;
			String day = switch(month) {
				case APRIL, FEBRUARY, JUNE, NOVEMBER, SEPTEMBER -> "小の月";
				case AUGUST, DECEMBER, JANUARY, JULY, MARCH, MAY, OCTOBER -> "大の月";
			};
			out.println(day);
		}

		//--------------------------------------------------
		// record （Java 14 プレビュー）
		{
			// インナー record 定義
			record Point(int x, int y) {}

			// getter 自動生成 - 結果: 10
			out.println(new Point(10, 20).x());

			// toString 自動生成 - 結果: Point[x=10, y=20]
			out.println(new Point(10, 20));

			// equals 自動生成 - 結果: true
			out.println(new Point(10, 20).equals(new Point(10, 20)));
		}

		//--------------------------------------------------
		// テキストブロック （Java 14 セカンドプレビュー）
		{
			// 結果: "Hello\n    World"
			String s = """
					Hello
						World
							""";
			System.out.println(s);
		}

		//--------------------------------------------------
		// instanceof パターンマッチ （Java 14 プレビュー）
		{
			// instanceof で代入 - 結果: 3
			Object object = 1;
			if (object instanceof Integer i) {
				out.println(i + 2);
			}
			// 型と値の複合条件
			if (object instanceof Integer i && i == 1) {
				out.println(i);
			}
		}

		//--------------------------------------------------
		// NullPointerException 詳細出力 （Java 14 標準）
		// 実行構成の VM 引数に -XX:+ShowCodeDetailsInExceptionMessages 追加
		// 結果:
		/*
		Exception in thread "main" java.lang.NullPointerException:
			Cannot invoke "String.length()" because "s" is null
				at Demo.main(Demo.java:78)
		*/
		{
			String s = null;
			s.length();
		}
	}
}
```