2013-04-29 5 views
2

Как написать функцию, которая возвращает значение по умолчанию для данного класса? Если класс является одним из примитивов, он должен возвращать класс-оболочку со значением по умолчанию, иначе возвращает null.Значение по умолчанию из класса

public <B> Object defaultValue(Class<B> clazz) { 
    return clazz.isPrimitive() ? ... : null; 
} 

Так int.class он должен вернуть Integer(0).

+0

Вы не можете сделать это в одной строке (если это то, что вы хотите сделать). –

+0

Не обязательно должна быть одна строка. – milan

+2

Сделайте отдельные случаи «если» для каждого из возможных классов. –

ответ

3

Как написать функцию, которая возвращает значение по умолчанию для данного класса? Если класс является одним из примитивов, он должен возвращать класс-оболочку со значением по умолчанию, иначе возвращает null.

Так я полагаю, что для примитивов, как int.class вы хотите вернуть new Integer(0), но позволяет сказать, что объекты, которые вы хотите вернуть null.

Если это правда, вы можете использовать факт, что в начале массивы заполняются значениями по умолчанию. Попробуйте, может быть, таким образом

import java.lang.reflect.Array; 
... 

public static <B> Object defaultValue(Class<B> clazz) { 
    return Array.get(Array.newInstance(clazz, 1),0); 
} 
  • Array.newInstance(clazz, 1) создаст массив типа clazz с одного элемента по умолчанию,
  • Array.get(<someArray>, 0) вернет свой первый элемент.
  • также, так как ваш метод defaultValue возвращает объект, он будет автобоксирован до соответствующего типа int ->Integer.

Пример

System.out.println(defaultValue(int.class)); 
System.out.println(defaultValue(int.class).getClass()); 

печатает

0 
class java.lang.Integer 
+0

Действительно аккуратное решение! – phoenix7360

+0

@ phoenix7360 Спасибо :) – Pshemo

0

Зачем вам это нужно? По умолчанию выполняется компилятор, а не путем вызова существующих методов.

Вот значение по умолчанию для примитивов, вы могли бы, конечно, написать функцию, которая превращает эту таблицу в значения ...

Data Type Default Value (for fields) 
byte  0 
short  0 
int   0 
long  0L 
float  0.0f 
double  0.0d 
char  '\u0000' 
Object  null 
boolean  false 

Read this tutorial link

1

Одним из способов достижения этой цели является использование карты для хранения значения:

private static Map<Class, Object> defaultValues = new HashMap<Class, Object>(); 

static { 
    defaultValues.put(byte.class, 0); 
    defaultValues.put(short.class, 0); 
    defaultValues.put(int.class, 0); 
    defaultValues.put(long.class, 0L); 
    defaultValues.put(float.class, 0.0f); 
    defaultValues.put(double.class, 0.0d); 
    defaultValues.put(char.class, '\u0000'); 
    defaultValues.put(boolean.class, false); 
} 

public <B> Object defaultValue(Class<B> clazz) { 
    return defaultValues.containsKey(clazz) ? defaultValues.get(clazz) : null; 
} 
1

Вы можете использовать ClassUtils класс Apache lang3 library:

import org.apache.commons.lang3.ClassUtils; 

public Object defaultValue(Class<?> clazz) throws InstantiationException, IllegalAccessException, 
     IllegalArgumentException, InvocationTargetException { 
    final Class<?> c = ClassUtils.primitiveToWrapper(clazz); 
    if (c != null && !c.equals(clazz)) { 
     final Constructor[] ctors = c.getConstructors(); 
     Constructor ctor = null; 
     for (int i = 0; i < ctors.length; i++) { 
      ctor = ctors[i]; 
      if (ctor.getGenericParameterTypes().length == 0) 
      break; 
     } 
     return ctor.newInstance(0); 
    } else { 
     return null; 
    } 
} 

Он возвращает нуль, если данный класс не является примитивным. Вы можете лучше обработать исключение.

+0

Он также плюет NPE. – milan

+0

@milan да действительно. Я отредактировал код – phoenix7360

Смежные вопросы