为什么有人会这样做?

时间:2015-01-30 21:14:00

标签: java

为什么会有人这样做?

private Number genericObjectToNumber (Object obj)
{
    if (obj instanceof Byte)
    {
        return(new Byte((Byte) obj));
    }
    else if (obj instanceof Short)
    {
        return(new Short ((Short) obj));
    }

.....

    else if(obj instanceof BigInteger)
    {
        return(BigInteger.ZERO.add ((BigInteger) obj));
    }
    return(null); // if it isn't a number, we don't want it
}

为什么不回归演员呢?为什么要浏览新对象的构造函数?为什么不问obj instanceof

    if (obj instanceof Number)
    {
        return((Number)obj);
    }

4 个答案:

答案 0 :(得分:11)

我认为没有正当理由这样做。如果对象是可变的并且您想要创建这些对象的副本,则可能有意义。但原始包装类是不可变的,因此使用现有对象调用构造函数是没有意义的。

答案 1 :(得分:2)

我认为,作者试图制作一个通用的复制功能。 它的工作方式就像hes试图创建一个新对象,如果这个对象是一个数字,在一个新实例中返回一个数字; e.g:

  

字节(字节值)   构造一个新分配的Byte对象,该对象表示指定的字节值。

可能,如果它有意义,他可能有很多数据,并且在操作时不知道是否是数字。因此,他希望只使用数字操作,或者想要使用公共单位,并避免例外,如果不是数字。我不是说这是继续这些情况的方式,但它可能有意义(作为解释而非推荐,听起来像c ++程序编写代码)。 BTW,正如其他答案所注意到的那样,对象是不可变的,所以如果这是一个真实的例子,那就没有充分的理由。

答案 2 :(得分:1)

由于以下几个原因,这没有任何意义:

  1. 原始类型是不可变的,没有理由通过" new"构造
  2. 区分不同的类是没有意义的,因为函数最后返回一个数字
  3. 即使区分和创建新实例是必要的,编写泛型方法http://docs.oracle.com/javase/tutorial/java/generics/methods.html可能会更好(除非代码是在一些不支持泛型的旧版java中编写的),然后复制这么多代码(虽然它会编译检查可能不需要的数字)
  4. 我能想到的唯一合理的理由是,如果列表中不包含所有类型的数字,并且程序员想要列出支持的数字类型,但即使这样,该方法也会被命名为

答案 3 :(得分:0)

因为原始代码显然是为了区分不同类型的数字。如果您刚刚返回“Number”,则obj将被转换为Number(即使它实际上不是数字)可能导致ClassCastException。通过使用原始代码,用户可以在某种程度上安全地将obj转换为正确的类型。