3

是否有任何理由使用 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 中是必要的。这种类型的代码还有什么原因吗?或者这只是一个坏习惯?

4

7 回答 7

8
  • 在 1.5 发布之前编写了很多代码。没有必要在不带来任何好处的情况下全部更新。
  • 在某些情况下,它可以更清楚地表明您正在拳击。在您提供的情况下,您可以轻松地在同一行上看到目标类型 - 但情况并非总是如此。
  • 如果你想调用一个对两者都有重载的方法,Integer并且int你想调用Integer重载,这是一种简单的方法。
于 2010-07-06T16:38:13.143 回答
4

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

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

于 2010-07-06T16:37:47.667 回答
4

除了乔恩的原因,有些人根本不喜欢自动(取消)拳击,时期。有些人选择通过可选的编译错误或警告(Eclipse 可以将它们变成错误或警告,例如)禁止其使用来明确避免它的许多细微差别

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

于 2010-07-06T16:44:17.613 回答
1

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

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

于 2010-07-06T16:45:12.590 回答
1

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

所以,归根结底,这一切都归结为个人喜好和项目的编码标准。

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

于 2010-07-06T16:45:24.100 回答
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 对象相等的所有对象。请记住,集合不能存储原语,只能存储对象。

于 2012-01-09T21:21:17.107 回答
-1

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

于 2010-07-06T16:35:56.550 回答