【问题标题】:Why would someone do this?为什么有人会这样做?
【发布时间】:2015-01-31 07:57:56
【问题描述】:

为什么有人会这样做?

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);
    }

【问题讨论】:

  • 没什么好理由的,只是有些人很傻。
  • 在java中你如何区分一个对象是真的byte还是真的long?有没有类似反射的东西?
  • @ryanyuyu bytes 和 longs 不是对象。
  • 只是猜测,但语法表明作者不是经验丰富的 Java 开发人员。尤其是把返回值用括号括起来,就好像 return 是一个方法调用一样,看起来非常非 Java 风格。

标签: java


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    可能,如果要有意义的话,他可能有很多数据,并且在操作时不知道是否是数字。因此,他只想使用数字进行操作,或者想在之后使用一个通用单位,如果不是数字则避免异常。我并不是说这是处理这些情况的方法,但它可能是有道理的(作为解释而不是推荐,听起来像是 c++ 程序编写了代码)。顺便说一句,正如在其他答案中所注意到的,对象是不可变的,所以如果这是一个真实的例子,那就没有充分的理由。

    【讨论】:

      【解决方案3】:

      这没有意义有几个原因:

      1. 原始类型是不可变的,没有理由通过“新”构造函数
      2. 区分不同的类是没有意义的,因为函数最后会返回一个数字
      3. 即使区分和创建一个新实例是必要的,写一个泛型方法http://docs.oracle.com/javase/tutorial/java/generics/methods.html 可能会更好(除非代码是用一些不支持泛型的旧版本 java 编写的),然后复制这么多代码(尽管它会编译检查可能不需要的数字)

      我能想到的唯一合理的原因是,如果列表不包含所有类型的数字,并且程序员希望将支持的数字类型列入白名单,但即便如此,该方法的名称也不正确

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • if (obj instanceof Number) 检查会失败
        • 您仍然可以使用强制转换来实现此行为 (if (o instanceof A) return (A) o;)。无需创建新对象。
        • 而且你可以像原来的函数一样在检查后始终保留return null
        • if (obj instanceof Number) 会处理ClassCastException。但是,由于 Number 是一个抽象超类,您必须重新转换为子类才能使用任何方法。
        • @mstbaum 当然,但原始版本也返回了Number
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-06
        • 2020-05-24
        • 1970-01-01
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多