在Java中使用包装类而不是原语的好处

时间:2012-12-22 01:40:28

标签: java wrapper

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

6 个答案:

答案 0 :(得分:7)

首先是集合,例如List<Integer>,您不能在此处使用原始int。 实际上任何可以使用不同对象类型的通用类/接口,如

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

请注意,最好使用新的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

答案 1 :(得分:2)

包装类旨在为基元类型添加更多功能,以便它们与通用代码兼容,使用Collection Framework以及许多其他好处。但是,它们并不意味着替换基本类型。

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

答案 2 :(得分:1)

包装器类型使基元能够保持更多的上下文含义。例如,一个整数可以是任何东西,而一个名为Hours的类,例如,给出数字的含义,无论它在何处使用。

它们还支持编写方法,以一致且明显的方式将所述原语变为消费者。有关此点的更多信息,请查看Domain Driven Design

答案 3 :(得分:0)

原始类型只保存值,包装类为其赋予名称。

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

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

答案 4 :(得分:0)

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

Integer no = null;    // not set

你必须使用像-1这样的魔术值来表示原始变量是“未设置”。

答案 5 :(得分:0)

想象一下:你玩游戏是因为你需要保存状态而你想要在不同的计算机上玩游戏(同一游戏)然后你决定将状态(等级)带到另一台计算机然后你可以从那个状态继续(不是从一开始)..如果你当前的武器状态是3,那么就来问问题。像{int weapons = 1;如果(你通过播放一些级别来加入武器现在好了吗)但你无法将它作为对象存储,因为原语是不同的。(生活在堆栈中)。所以你需要武器作为对象((解决方案:创建整数对象)) 整数武器=新整数(1){...}