ローカル変数型推論の導入
Java 10で導入されたvarキーワードは、ローカル変数の型をコンパイラが自動的に推論する機能を提供します。これは、特に複雑な型名を扱う際にコードを簡潔にし、可読性を向上させる目的で追加されました。
varの使用は、メソッド内のローカル変数に限定されます。コンパイラは、初期化式から変数の型を自動的に判断します。
package com.example.varintro;
import java.util.ArrayList;
import java.util.HashMap;
public class VarExample {
public static void main(String[] args) {
// コンパイラは new Greeting() から型を推論する
var greeter = new Greeting();
greeter.sayHello();
// コンパイラは 42 から int 型を推論する
var counter = 42;
System.out.println("カウンタの値: " + counter);
// 複雑なジェネリクス型も推論可能
var numberList = new ArrayList<Integer>();
numberList.add(10);
numberList.add(20);
numberList.add(30);
for (var number : numberList) {
System.out.println("リストの要素: " + number);
}
// より複雑なMapの例
var configMap = new HashMap();
configMap.put("host", "localhost");
configMap.put("port", "8080");
System.out.println("設定: " + configMap);
}
static class Greeting {
public void sayHello() {
System.out.println("こんにちは!");
}
}
}
varの制限事項
Javaのvarにはいくつかの重要な制限事項があります。これらは言語の後方互換性を保つためのものです。
- フィールド(インスタンス変数)として使用できない:クラスのフィールドとして宣言することはできません。
- 初期化が必要:変数を宣言する際に、初期化式を提供する必要があります。初期化なしや
nullのみの代入は許可されません。 - メソッドの引数や戻り値の型として使用できない:メソッドのシグネチャでは
varを使用できません。
以下のコードは、これらの制限を示しています。
package com.example.varintro;
public class VarRestrictions {
// フィールドとしてvarは使用できない
// var field = "これはエラーになります";
public void method() {
// 初期化なしでvarを使用することはできない
// var uninitialized;
// nullのみの代入も許可されない
// var nullValue = null;
// メソッドの引数や戻り値の型としてvarは使用できない
// public void process(var data) { ... }
// var getSomething() { ... }
}
}
ベストプラクティス
varは、特に右辺の式が複雑な型を含む場合に、コードの可読性を大幅に向上させます。一方、右辺の式が非常にシンプルな場合(例: int x = 5;)にvarを使用すると、可読性が逆に損なわれる可能性があります。
以下は、複雑な型名を扱う際のvarの利点を示す例です。
package com.example.varintro;
import java.util.concurrent.ConcurrentHashMap;
public class BestPracticeExample {
public static void main(String[] args) {
// 複雑な型名を明示的に書く場合
ConcurrentHashMap explicitMap = new ConcurrentHashMap<>();
// varを使用して簡潔に記述する場合
var conciseMap = new ConcurrentHashMap();
// 可読性の観点から、後者の方が優れていると言えます。
System.out.println("マップが作成されました。");
}
}
class CustomObject {
// カスタムオブジェクトの定義
}