SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

初めての6カ月定期アップデートで変わったJava 10、ポイントを押さえよう

varを使って型指定をせずにプログラミング! さらにお手軽になったJava 10

初めての6カ月定期アップデートで変わったJava 10、ポイントを押さえよう 第1回


ローカル変数時のvarを用いた型推論(2)

利用できないケース

 ローカル変数時と特定しているように、リスト4のようなローカル変数以外であるクラス変数や定数としては利用できません。

[リスト4]クラス変数・定数として利用できない例( com/coltware/sample/BasicVar.javaの抜粋 )
public class BasicVar {
    // クラス変数には利用できないため、以下のようなコードは記述できない
    private var str0 = "Hello World";
    public static var DEF_VALUE = 100;
}

 また、利用できそうでできないケースもあります。例えば、リスト5のようにint型の配列を作りたい場合にも利用できません。

[リスト5]varを使った基本的な型宣言の例
jshell> var arr = {1,2,3,4};
|  エラー:
|  ローカル変数arrの型を推論できません
|    (配列初期化子には明示的なターゲット型が必要です)
|  var arr = {1,2,3,4};
|  ^------------------^
jshell> var arr = new int[]{1,2,3,4};
arr ==> int[4] { 1, 2, 3, 4 }

注意すべきケース

 一方、利用することで間違いやすくなるケースや勘違いしやすいケースもあります。これらは、varを使わなくても同じなのですが、型がないことでコーディングする際に勘違いを生みやすい場合があるので、その一例を紹介します。

 リスト6はint型同士で割り算をした場合の例です。int型同士の計算はintになるので、型が記述してあってもなくても、勘違いしない、問題ないという方もいるかもしれません。

 ただし、JavaScriptなど型制限がゆるい言語の場合には、0.5という値になるケースが多いので、他の言語の文化に慣れている方にとっては非常に勘違いしやすいコードになります。

[リスト6]注意すべき利用方法( com/coltware/sample/BasicVar.javaの抜粋 )
var num1 = 1; var num2 = 2;
var num3 = num1 / num2;  // 値は0になる
if( num3 > 0 ) {
  // 0.5を期待
}
else {
  // 実際にはこちらが実行される
}

その他の変更API

 Java 10で変更されたAPIを紹介します。

コレクションのコピーメソッドの追加

 List/Map/Setクラスに対して、リスト7のようにコピーするためのcopyOfメソッドが追加されました。

 このメソッドを使うことでコレクションの内容をコピーしなくてよい場合など、実際にコピーせずに参照を返すことができるメリットがあります。

[リスト7]List/Map/Setに追加されたcopyOfメソッドの利用例( com/coltware/sample/OtherApi.javaの抜粋 )
var list1 = List.of(1,2,3);
var list2 = List.copyOf(list1);

var map1 = Map.of("key1","val2");
var map2 = Map.copyOf(map1);

var set1 = Set.of("key1","key2");
var set2 = Set.copyOf(set1);

 copyOfメソッドで作成されたオブジェクトは、ofメソッドで作成されたオブジェクトと同様に変更はできません。

 従って、リスト8のように変更可能なListオブジェクトを、copyOfメソッドを使ってコピーしても、追加時には例外が発生します。

[リスト8]copyOfを使って作成されたオブジェクトに値を追加した場合の例外
jshell> var list = new ArrayList<Integer>();
list ==> []
jshell> var list1 = List.copyOf(list);
list1 ==> []
jshell> list1.add(1);
|  java.lang.UnsupportedOperationException thrown
|        at ImmutableCollections.uoe (ImmutableCollections.java:71)
|        at ImmutableCollections$AbstractImmutableList.add (ImmutableCollections.java:77)
|        at (#34:1)

Optionalでのメソッド追加

 引数無しのorElseThrow()メソッドが追加されました。これは、Optional.get()もしくは、引数を指定したorElseThrow()の代替となるためのメソッドです。

 getという名称から多くの場合、例外を発生しないと勘違いしやすいということで別名のメソッドが用意されました。

[リスト9]Optionalクラスに追加されたorElseThrowメソッド( com/coltware/sample/OtherApi.javaの抜粋 )
Optional<String> opt = Optional.empty();
try {
    // String str = opt.get(); と同じ
    String str = opt.orElseThrow();
}
catch (NoSuchElementException ex){
    // empty()の場合
}

次のページ
バージョン番号に関する変更点

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

初めての6カ月定期アップデートで変わったJava 10、ポイントを押さえよう 連載記事一覧
この記事の著者

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本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10872 2018/07/05 11:43

イベント

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

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

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

メールバックナンバー