変数のデフォルト値(主にプリミティブの)取得の抽象化

概要

Classオブジェクト(特にプリミティブ型)から、変数のデフォルト値を取得する。

前提

static変数、インスタンス変数、配列の要素はデフォルト値で初期化されます。

Each class variable, instance variable, or array component is initialized with a default value when it is created

http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5

参照型の場合はnullなのであまり価値はありません。
変数宣言することなしにプリミティブ型のデフォルト値を取得するにはどうすればよいか。

やり方

リフレクションで配列を生成すれば、中身はデフォルト値が入っています。
以上。

package test;

import java.lang.reflect.Array;

public class VariableInit {

    @SuppressWarnings("unchecked")
    public static <T> T varInit(final Class<T> clazz) {
        return (T) Array.get(Array.newInstance(clazz, 1), 0);
    }
    
    public static void main(final String[] args) {
        System.out.println(varInit(boolean.class));
        System.out.println(varInit(byte.class));
        System.out.println(varInit(short.class));
        System.out.println(varInit(int.class));
        System.out.println(varInit(long.class));
        System.out.println(varInit(float.class));
        System.out.println(varInit(double.class));
        System.out.println(varInit(char.class));
        System.out.println(varInit(String.class));
        
        // 型付き
        int initValue = varInit(int.class);
    }

}

varInitの戻り値はClassオブジェクトの型パラメータでキャストすれば、正しく型が付いています。

実行結果

false
0
0
0
0
0.0
0.0

null

なお、charの初期値は\u0000で、見えません。