2009-11-13 7 views
8

提供されたクラスタイプのインスタンスを返すメソッドが必要です。与えられた型が "空の"インスタンスを作成できるように制限されていると仮定しよう。たとえば、String.classを指定すると、空のStringが返され、Integer.classを指定すると、初期値がゼロのIntegerが返されます。しかし、どのようにして(ボックス化された)プリミティブ型を即座に作成できますか?このような?クラスが既知の(箱入りの)プリミティブインスタンスを作成する

public Object newInstance(Class<?> type) { 
    if (!type.isPrimitive()) { 
     return type.newInstance(); // plus appropriate exception handling 
    } else { 
     // Now what? 
     if (type.equals(Integer.class) || type.equals(int.class)) { 
      return new Integer(0); 
     } 
     if (type.equals(Long.class) // etc.... 
    } 
} 

すべての可能なプリミティブ型を反復処理する唯一のソリューションですか?それとももっと簡単な解決策ですか? (彼らは引数なしのコンストラクタを持っていないので)両方

int.class.newInstance() 

Integer.class.newInstance() 

InstantiationExceptionを投げることに注意してください。

答えて

12

私は最も簡単な方法は、マップを持つことである疑いがある:

private final static Map<Class<?>, Object> defaultValues = 
    new HashMap<Class<?>, Object>(); 
static 
{ 
    defaultValues.put(String.class, ""); 
    defaultValues.put(Integer.class, 0); 
    defaultValues.put(int.class, 0); 
    defaultValues.put(Long.class, 0L); 
    defaultValues.put(long.class, 0L); 
    defaultValues.put(Character.class, '\0'); 
    defaultValues.put(char.class, '\0'); 
    // etc 
} 

は幸いにも、すべてのこれらのタイプは不変ですので、同じタイプのために各呼び出しで同じオブジェクトへの参照を返すことも大丈夫です。

+0

@Joonas:もう一度見てください:) –

+0

ありがとう!それは働くかもしれません:) –

+0

私は私が行くだろうと思う?:チェーン。 'type == long.class? (長い)0L: 'など –

関連する問題