整型(Integer)、双精度浮点型(Double)、长整型(Long)等构造函数已被弃用。

100

在工作时,我收到了警告。

The constructor Integer(int) is deprecated

我在网上找不到可替代的构造函数/解决方案。我该如何解决这个问题?

更新

对于其他基本包装类型的构造函数,例如,我会得到类似的警告。

The constructor Boolean(boolean) is deprecated
The constructor Byte(byte) is deprecated
The constructor Short(short) is deprecated
The constructor Character(char) is deprecated
The constructor Long(long) is deprecated
The constructor Float(float) is deprecated
The constructor Double(double) is deprecated

这些类是否适用于与Integer相同的解决方案?


6
因为存在整数缓存范围为-128到127。在该范围内使用valueOf将返回这些实例而不是反复创建新实例。 - AxelH
8
在查看Integer API之前,你为什么要问这个问题呢?API中清楚地说明了应该使用什么。请理解,本网站希望您在提问之前多付出一点努力。 - Hovercraft Full Of Eels
1
将此问题和答案更新为适用于所有包装类。 - Stephen C
@AlexH 看起来 Double.valueOf(8.5) == Double.valueOf(8.5) 仍然是 false,这似乎有点浪费。毕竟我们在21世纪并不会为内存所苦。 - Andrew S
3
感谢你的提问。一些老用户可能会忘记,虽然你可以自己进行研究并且继续前进,但答案不仅仅只是为了回答问题者,还为了接下来的5000个人快速找到正确答案。即使你已经进行了研究,但没有在这里找到答案,最好还是在这里提问并得到答案。 - Bill K
@HovercraftFullOfEels,然而在vscode中没有解释或解决方案,这是谷歌搜索的第一个结果,而不是Java官方文档。而且,早晚ChatGPT等平台可能会比官方文档更受欢迎。 - BingLi224
1个回答

163
你可以使用

Integer integer = Integer.valueOf(i);

根据构造函数的 JavaDoc

已弃用。很少有情况需要使用此构造函数。通常情况下应该选择静态工厂方法 valueOf(int),因为它很可能会产生更好的空间和时间性能。构造一个表示指定 int 值的新分配的 Integer 对象。

主要区别在于使用 valueOf 方法时并不总是会得到一个新实例,因为小整数值的 Integer 实例是被缓存的。


所有的原始类型包装类(BooleanByteCharShortIntegerLongFloatDouble)都采用了相同的模式。一般来说,应将:

    new <WrapperType>(<primitiveType>)

使用

    <WrapperType>.valueOf(<primitiveType>)

(请注意,上述缓存行为与类型和Java平台有所不同,但Java 9+的弃用尽管存在这些差异仍然适用。)


10
由于自动装箱的存在,您甚至不需要使用valueOf(int) - Kayaman
5
那只是一个合成的例子,因为只有精神病患者才会过载 intInteger,并且让这些方法具有不同的逻辑。可能有一些特殊情况需要显式地使用 valueOf(int),但我很难想出什么是“自然”的。 - Kayaman
10
精神变态者编写集合API? :-) https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#remove-int- - soc
3
@soc @Kayman,“List.remove”方法并不是“精神病患者”的产物,这只是历史原因。虽然集合API来自Java 1.2,但自动装箱是在更晚的时候引入的,所以当时不存在歧义。虽然他们本可以为这些方法选择不同的名称,但他们无法预测到自动装箱的出现。 - Dorian Gray
5
new关键字确实不幸地控制了从外部进行实例构建。像Java中的许多不好的东西一样,它是从C++中复制而来的 :D new可以与Python进行对比,在Python中,新实例始终是在工厂中构造的 - 而且,@AndrewS,你的做法在Python中起作用(实际上也确实起作用)。Pythonic的方法应该是使用语法Integer integer = Integer(i);,并让类Integer决定是否返回一个新实例或在工厂中回收一些旧实例或者完全不同的实例。 - Antti Haapala -- Слава Україні
显示剩余12条评论

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