سؤال

أحتاج إلى طريقة إرجاع مثيل من نوع الفصل المرفق. دعنا نفترض أن الأنواع المقدمة تقتصر على بحيث يمكن إنشاء مثيل "فارغ" منهم. على سبيل المثال، توريد 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 (لأنهم لا يملكون منشئين غير فارغة).

هل كانت مفيدة؟

المحلول

أظن أن أبسط طريقة هي أن يكون لديك خريطة:

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
}

لحسن الحظ، كل هذه الأنواع غير قابلة للتغيير، لذلك لا بأس في إعادة المرجع إلى نفس الكائن في كل مكالمة لنفس النوع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top