2009-11-13 13 views
8

पर जाना जाने वाला आदिम उदाहरण बनाना (बॉक्सिंग) आदिम उदाहरण मुझे एक विधि की आवश्यकता है जो आपूर्ति किए गए वर्ग प्रकार का उदाहरण देता है। आइए मान लें कि आपूर्ति किए गए प्रकार इस तरह सीमित हैं कि उनमें से एक "खाली" उदाहरण बनाया जा सकता है। उदाहरण के लिए, String.class की आपूर्ति एक खाली स्ट्रिंग वापस कर देगी, Integer.class की आपूर्ति एक इंटीजर लौटाएगी जिसका प्रारंभिक मान शून्य है, और इसी तरह। लेकिन मैं फ्लाई पर आदिम प्रकार (बॉक्सिंग) कैसे बना सकता हूं? इस कदर?क्लास को

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 (क्योंकि वे nullary कंस्ट्रक्टर्स नहीं है)।

उत्तर

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

@ जुनास: अब एक और देखो :) –

+0

धन्यवाद! यह काम कर सकता है :) –

+0

मुझे लगता है कि मैं एक के लिए जाना होगा? श्रृंखला। 'टाइप == long.class? (लांग) 0 एल: ', आदि –

संबंधित मुद्दे