Integer.valueOf()的值

时间:2010-07-06 16:34:00

标签: java autoboxing

有没有理由使用Integer.valueOf(X)来初始化最终的Integer,如下所示:

public class MyClass
{
  public static final Integer DAY_1 = Integer.valueOf(1); // Why do it this way?
  public static final Integer DAY_2 = 2; // When it can be done this way?
}

我知道在添加自动装箱之前,在旧版本的Java中这是必要的。这种代码有什么原因吗?或者这只是一个坏习惯?

7 个答案:

答案 0 :(得分:8)

  • 在1.5出现之前写了很多代码。没有任何好处,就没有必要更新所有内容。
  • 在某些情况下,您可以更清楚地了解拳击。在你给你的情况下,你可以很容易地在同一条线上看到目标类型 - 但情况并非总是如此。
  • 如果要调用一个对Integerint都有重载的方法,并且想要调用Integer重载,这是一种简单的方法。

答案 1 :(得分:4)

程序员可能会选择以这种方式编写它,以便直观地强调DAY_1是一个整数(对象),而不是一个整数。

我不是说我推荐它,但我可以想象有人因此而采取这种方法。

答案 2 :(得分:4)

除了Jon的原因,有些人根本不喜欢自动(联合国)拳击,期间。有些人通过可选的编译错误或警告(Eclipse可以将它们变成错误或警告,例如)来选择明确地避免使用它们,这有很多细微差别。

如果是这样的话,除了使用第一个之外没有太多选择,即使在这样的情况下它并没有真正获得太多。

答案 3 :(得分:1)

就编译器而言,没有区别(尽管在重载参数的情况下应该小心)。在幕后,DAY_2显示的表单只是转换为编译器用于DAY_1的表单。

对于人类来说,可能会有所不同。我通常避免将自动(联合)拳击作为防御性编程的行为,因为我觉得这种做法让我很容易忘记空案例。但实际上,这取决于你。

答案 4 :(得分:1)

自动装箱可能会导致非常微妙的错误,可能很难找到。 因此,当使用任何类型的装箱/拆箱时,某些IDE能够生成警告。如果你想让这个警告静音,选项1会为你做。

因此,最终,这一切都取决于个人偏好和项目的编码标准。

在这种特殊情况下,使用自动装箱没有危险。

答案 5 :(得分:1)

Integer.valueOf(1)允许缓存常用值;对于从-128到128的值,它将始终返回相同的对象,而新的Integer(1)将始终返回一个新对象。我会说这是一个很好的做法,可以将它用于所有Number派生类型(Integer,Long,BigDecimal等),尽管这可能是自动装箱在封面下做的事情。

Bart van Heukelom,list.remove(1)和list.remove(new Integer(1))之间的区别是这样的; list.remove(1)将从列表中删除索引1处的对象,list.remove(new Integer(1))将删除列表中与Integer对象相等且值为1的所有对象。请记住,集合不能存储基元,只能存储对象。

答案 6 :(得分:-1)

这是一个坏习惯,没有理由这样做,因为编译会为你生成Integer.valueOf()