JDK

Java 14 新機能 (5)

JPackageというツールが導入されてインストーラパッケージを作成できるようになっていますが,私のPC(Windows)ではインストーラを作成するツールであるWixとの連携がうまくいかず,作成できませんでした。JPackageは裏でWixのcandle.exeとlight.exeを呼び出しているようで,candle.exeは正常に終了しましたが,light.exeは対応していないコードページを使おうとして動かなくなってしまったようです。

これまで通り手動でjarファイルにパッケージングして,Wixを動かせばよいだけですが,日本語環境までは十分に配慮されていない感じでした。

JDK

Java 14 新機能 (4)

次はrecordを紹介する。recordは簡易版のclassのようなものである。POJOで書いていた部分はrecordを使うことが可能かもしれない。recordは他のクラスを継承できず,private finalなインスタンス変数しか持つことができない。recordは暗黙的にfinalである。

public class RecordExample
{
    public static void main(String[] args)
    {
        Person person = new Person("はらだ たかひこ", 38);
        System.out.printf("名前: %s\n", person.getName());
        System.out.printf("年齢: %d歳\n", person.getAge());
    }
}
record Person(String name, int age)
{
    public String getName()
    {
        return name;
    }
    public int getAge()
    {
        return age;
    }
}
JDK

Java 14 新機能 (3)

3番目に新たなswitchステートメントの記述方法を紹介する。switchはC言語の仕様から導入されてきたこともあり,しばしばbreakが抜けてトラブルを起こすことがあった。今回,”->”を用いた新たな記法が導入されている。

public class SwitchStatement
{
    public static void main(String[] args)
    {
        int i = 1;
        switch(i)
        {
            case 0 -> System.out.println(“ZERO”);
            case 1 -> System.out.println(“ONE”);
            case 2 -> System.out.println(“TWO”);
        }
    }
}
JDK

Java 14 新機能(2)

次は進化したinstanceof演算子を試してみる。従来のinstanceof演算子はオブジェクトが指定したクラスのインスタンスかどうかをチェックし,結果をboolean型で返すだけのものであった。進化したinstanceof演算子では,オブジェクトが指定した型に合致する場合はキャストして変数に格納するところまでやってくれる。

public class Instanceof
{
    public static void main(String[] args)
    {
        Object i = 1;
        if(i instanceof Integer integer)
        {
            // 従来は(Integer)i + 2と明示的なキャストをしていた
            System.out.println(integer + 2);
        }
    }
}
JDK

Java 14 新機能(1)

3月17日にJava14がリリースされました。早速ダウンロードして試してみます。

まずは,一番簡単な機能から試そうと,テキストブロックというものを使ってみます。これはヒアドキュメントのようなもので,複数行に渡る文字列をそのままソースコードに書けるというもの。次のようなプログラムを書いて,コマンドラインでjavac TextBlockと打つと,なんと

TextBlock.java:3: エラー: テキスト・ブロックはプレビュー機能であり、デフォルトで無効になっています。

と仰せです。

 言われた通りにjavac –enable-preview TextBlock.javaと打ってみます。すると

エラー: –enable-previewは-sourceまたは–releaseとともに使用する必要があります

と叱られました。懲りずに,もう一度言われた通りにjavac –enable-preview -source 14 TextBlock.javaと打って,ようやくコンパイルできました。警告が出ましたが,とりあえず無視して先に進みます。

public class TextBlock
{
    private static final String text = “””
            <html>
                <head>
                </head>
                <body>
                </body>
            </html>”””;
    public static void main(String[] args)
    {
        System.out.println(text);
    }
}

コンパイルができたので,java TextBlockと打って実行します。すると

エラー: メイン・クラスTextBlockのロード中にLinkageErrorが発生しました

というエラーメッセージ。英語でTry running with ‘–enable-preview’と書かれていたので,javaコマンドにも–enable-previewオプションをつけて実行し,ようやく期待していた出力が得られました。

要するに,まだ正式な機能ではないからきちんと動かなくても知らないよということでしょう。