Java10がリリースされました

未来環境ラボの中口です。

遂にJava10がリリースされました。前バージョンのJava9から半年でリリースされことになり,Java8からJava9までに3年半かかったことを考えると大幅なスピードアップです。これはJavaを提供しているOracleが,新機能をどんどん取り入れてJavaを進化させるよう方向転換したためで,今後半年毎に新しいバージョンがリリースされる予定です(関連記事)。

さて,Java10ではいくつか新機能が導入されていますが,目玉はやはり,ローカル変数の型推論,”var”でしょう。JavaはJavaScriptやPythonと違って,変数の型を強く意識する必要がある,静的型付け言語です。静的型付け言語では,ソースを記述する際に,変数の型を決めておく必要があり,一旦型を決めると,後で変更できません(例えばint型の変数にString型のオブジェクトを入れることはできません)。そのため変数を使うたびに型を明示的に記述する必要があり,どうしても記述が冗長になってしまいます。コード例を見てみましょう。

List<String> strings = new ArrayList<String>();

Javaを書いたことがある人なら一度はこんなコードを書いたことがあると思いますが,変数の宣言時(“=”の左側)で変数の型(List<String>)を指定し,変数に代入するオブジェクトの生成時(“=”の右側)でも型(ArrayList<String>)を記述しています。varでは,この左側の型を省略できます。

var strings = new ArrayList<String>();

もちろんメソッドの戻り値を代入する際にも利用できます。

var r = Math.random() * 10;

ただしJavaは静的型付け言語であるという特徴は変わっておらず,スクリプト言語のように後から型を決めたり変えたりということができるようになったわけではありません。例えば次のコードはコンパイルエラーになります。

var i;
i = 10;

varを使うと変数の型を省略できますが,同時に変数の初期化を行う必要があり,その初期化で実際の型がわかる必要があります。例えば,次のコードはコンパイルできますが,

Runnable r = () -> {};

varを使うとコンパイルエラーになります。

var r = () -> {};  // コンパイルエラー!!

右側はラムダ式ですが,ラムダ式は実際のクラスを代入先の変数の型などで決めるので,varを使うと変数もラムダ式も型を決めようとしてお互いの情報に頼ってしまうので決まりません。逆に実際の型さえわかればその型として使えるので,今まで明示的に指定できなかった匿名クラスを扱うことができ,そのメソッドを呼び出せます(関連記事)。

var o = new Object(){
   public void func(){
  }
}
o.func();

個人的にはこれが一番嬉しいんですが,結構特殊なケースなのでピンとこない人も多いかもしれません。

Javaは今後半年ごとに新機能が追加され,どんどん進化していきます。他の言語も良いものがたくさんありますが,今一度Javaを見直してみてはいかがでしょう?

comments