6

在非常抽象的层面上,我确实知道包装类创建一个原始数据类型的对象,但我很好奇为什么我们需要使用包装类以及它们比原始数据类型有什么好处。

4

6 回答 6

8

首先是集合,例如 ,List<Integer>你不能int在这里使用原语。实际上任何可以与不同对象类型一起使用的通用类/接口,例如

public interface Callable<V> {
    V call() throws Exception;
}

请注意,最好使用不是 new Integer(i) 而是 Integer.valueOf(i) 完成包装,后者将尝试使用缓存。展开以 Integer.intValue() 的形式完成。这些原语的包装/拆包是非常典型的操作,Java 5 引入了自动装箱/拆箱

List<Integer> list = new ArrayList<>();
list.add(1);
int i = list.get(0);

此代码由 Java 编译器自动转换为

list.add(Integer.valueIf(1));
int i = list.get(0).intValue();    // this is where NullPointerException sometimes happens
于 2012-12-22T01:45:16.120 回答
2

包装类旨在为原始类型添​​加更多功能,以便它们与通用代码兼容,使用集合框架以及许多其他好处。但是,它们并不是要取代原始类型。

因此,您应该仅在必要时使用包装器,例如在处理泛型时,因为创建对象会为您的程序增加大量开销。因此,在正常情况下,您应该坚持使用原语。

于 2012-12-22T05:06:31.647 回答
1

包装器类型使原语能够保持更多的上下文含义。例如,一个整数可以是任何东西,而一个名为 Hours 的类,例如,在任何地方使用它都会赋予数字含义。

它们还允许编写方法,以对消费者一致且明显的方式改变所述原语。有关这一点的更多信息,请查看领域驱动设计。

于 2012-12-22T01:42:29.687 回答
0

原始类型只保存值,包装类给它一个名字。

使用类名,编译器可以为您进行一些静态检查。它使界面更有意义。您还可以在包装类中定义一些方法来验证原始值。

通常,对于一个小项目,我认为使用原始类型就可以了。

于 2012-12-22T01:50:14.973 回答
0

包装器对象是普通对象,可以有引用null。这允许使用原语不可能的“未设置”状态。

Integer no = null;    // not set

您必须使用像 -1 这样的魔法值来指示原始变量“未设置”。

于 2012-12-22T02:21:20.503 回答
0

想象一下:您在玩游戏时需要保存状态并且您想在不同的计算机上玩(同一游戏)然后您决定将状态(级别)带到另一台计算机然后您可以从该状态继续(而不是从开始).. 好吧,如果您当前的武器状态为 3,请回答问题。like { int weapon=1; 如果(你通过玩一些级别来添加武器,现在好了 3)} 但你不能将它存储为对象,因为原语是不同的。(存在于堆栈中)。所以你需要武器作为对象((解决方案:创建整数对象))整数武器=新整数(1){...}

于 2014-06-11T05:28:47.360 回答