有没有理由使用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中这是必要的。这种代码有什么原因吗?或者这只是一个坏习惯?
答案 0 :(得分:8)
Integer
和int
都有重载的方法,并且想要调用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()
。