我编写了以下函数来返回原始或数字的默认表示0 或 false :
/**
* Retrieves the default value 0 / false for any primitive representative or
* {@link Number} type.
*
* @param type
*
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T getDefault(final Class<T> type)
{
if (type.equals(Long.class) || type.equals(Long.TYPE))
return (T) new Long(0);
else if (type.equals(Integer.class) || type.equals(Integer.TYPE))
return (T) new Integer(0);
else if (type.equals(Double.class) || type.equals(Double.TYPE))
return (T) new Double(0);
else if (type.equals(Float.class) || type.equals(Float.TYPE))
return (T) new Float(0);
else if (type.equals(Short.class) || type.equals(Short.TYPE))
return (T) new Short((short) 0);
else if (type.equals(Byte.class) || type.equals(Byte.TYPE))
return (T) new Byte((byte) 0);
else if (type.equals(Character.class) || type.equals(Character.TYPE))
return (T) new Character((char) 0);
else if (type.equals(Boolean.class) || type.equals(Boolean.TYPE))
return (T) new Boolean(false);
else if (type.equals(BigDecimal.class))
return (T) BigDecimal.ZERO;
else if (type.equals(BigInteger.class))
return (T) BigInteger.ZERO;
else if (type.equals(AtomicInteger.class))
return (T) new AtomicInteger();
else if (type.equals(AtomicLong.class))
return (T) new AtomicLong();
else if (type.equals(DoubleAdder.class))
return (T) new DoubleAdder();
else
return null;
}
当底层 SQL 查询返回 null 而不是 0 时,我在休眠 ORM 投影查询中使用它。
/**
* Retrieves the unique result or zero, <code>false</code> if it is
* <code>null</code> and represents a number
*
* @param criteria
*
* @return zero if result is <code>null</code>
*/
public static <T> T getUniqueResultDefault(final Class<T> type, final Criteria criteria)
{
final T result = (T) criteria.uniqueResult();
if (result != null)
return result;
else
return Utils.getDefault(type);
}
关于 Java的许多不必要的复杂事情之一,使其使用起来不直观。为什么实例变量用默认值 0 初始化但局部变量不是不合逻辑的。类似于为什么枚举没有内置标志支持和更多选项。与 C# 相比,Java lambda 是一场噩梦,不允许类扩展方法也是一个大问题。
Java 生态系统提出了为什么它不可能的借口,但我作为用户/开发人员我不关心他们的借口。我想要简单的方法,如果他们不解决这些问题,他们将来会松懈,因为 C# 和其他语言不会等待让开发人员的生活更简单。自从我每天使用 Java 以来,看到过去 10 年的衰落真是令人难过。