Integer.valueOf()的价值

3

在初始化最终的整数时,有没有使用Integer.valueOf(X)的原因,如下:

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的旧版本中添加自动装箱之前这是必要的。现在是否还有这种代码的原因呢?还是只是一种不好的习惯?


5
实际上,Integer.valueOf(int) 是在1.5版本中添加的,与自动装箱相同。这是为了更加清晰明了。在其他情况下可能会产生混淆。例如,在 List<Integer> 中,remove(int)remove(Integer) 有非常不同的作用。 - Tom Hawtin - tackline
好的,如果它是1.5版本之前的代码,那么它必须使用DAY_1 = new Integer(1);因此,这段代码必须是使用支持自动装箱的语言版本编写的。 - Tom Tresansky
Hawtin: 为什么 remove 的行为不同?难道所有常见的 List 实现都使用 equals 吗? - Bart van Heukelom
7个回答

8
  • 在1.5版本发布之前,有大量代码编写完成。没有必要更新这些代码而不带来任何好处。
  • 在某些情况下,使用自动装箱语法能使代码更加清晰明了。就像您所举的例子,在同一行上很容易看到目标类型 - 但并非总是如此。
  • 如果您想调用一个具有Integerint重载的方法,并且您想调用Integer重载,那么这是一种简单的方法。

4

为了在视觉上强调DAY_1是一个整数(对象),而不是int,程序员可能会选择以这种方式编写它。

我并不是说我推荐这样做,但我可以想象有人出于这个原因采取这种方法。


4
除了Jon提到的原因,有些人就是不喜欢自动装箱/拆箱。这方面有很多微妙之处,有些人选择通过可选的编译错误或警告来禁止其使用,以避免一般情况下的使用。比如Eclipse可以将它们转换成错误或警告。如果是这种情况,除了在像这样的情况下不会真正获得太多优势,没有什么选择只能使用第一种方法。

1
+1 我也这么认为 - 我认为在软件开发中使用隐式语法的好处很少,它会导致误解、歧义和未来潜在的维护问题。 - mikera
@mikera: 同上。我正在处理的代码库包含大量这样的语句,如“Double foo = Double.parseDouble(s); double bar = foo;”,即将字符串转换为double(原始数据类型),然后自动装箱成Double(对象),然后再自动拆箱成double(原始数据类型)。我猜作者认为parseDouble返回的是一个对象而不是一个基本数据类型。如果没有自动装箱,编译器就会立即警告他的错误。 - Jay

1

就编译器而言,它们没有区别(尽管在处理重载参数时应该小心)。在幕后,DAY_2 的形式只是由编译器转换为 DAY_1 使用的形式。

对于人类来说,可能会有所不同。我通常避免自动装箱和拆箱作为防御性编程的一种行为,因为我觉得这种做法使我太容易忘记空值情况。但实际上,这取决于你。


1

自动装/拆箱可能会导致非常微妙的错误,这些错误可能非常难以找到。因此,一些IDE具有在使用任何类型的装箱/拆箱时生成警告的能力。如果您想消除这些警告,选项1就可以为您完成。

因此,最终结果取决于个人喜好和项目的编码标准。

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


1

Integer.valueOf(1) 允许缓存常见的值;例如,对于从-128到128的值,它将始终返回相同的对象,而 new 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)) 将删除列表中所有等于值为 1 的 Integer 对象的对象。请记住,集合只能存储对象,而不能存储基本类型。


-1

这是一个不好的习惯,而且没有理由这样做,因为编译器会为你生成Integer.valueOf()


-1 这个API是在Java 5中添加的,原因很充分:性能(特别是自动装箱)。 - Aaron Digulla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接