我什么时候应该使用原始类型的包装类?或者在什么情况下我应该在包装器/原始类型之间进行选择?
11 回答
其他人提到某些构造,例如Collections
需要对象,并且对象比它们的原始对应物(内存和装箱)具有更多的开销。
另一个考虑是:
初始化对象null
或将null
参数发送到方法/构造函数以指示状态或功能可能很方便。这不能用原语来完成。
许多程序员将数字初始化为 0(默认)或 -1 来表示这一点,但根据具体情况,这可能是不正确或具有误导性的。
这也将为NullPointerException
不正确使用某些东西设置场景,这比一些任意的错误对程序员更友好。
在我看来,如果我的类成员是包装变量,它不依赖于默认值,这是开发人员友好的行为。
1.
class Person {
int SSN ; // gets initialized to zero by default
}
2.
class PersonBetter {
Integer SSN; //gets initialized to null by default
}
在第一种情况下,您不能保持 SSN 值未初始化。如果您在尝试使用它之前没有检查该值是否已设置,这可能会造成伤害。
在第二种情况下,您可以将 SSN 初始化为 null。这可能导致 NullPointerException,但它比在不初始化 SSN 字段的情况下尝试使用它时在不知不觉中将默认值(零)作为 SSN 插入到数据库中要好。
如果必须,我只会使用包装器类型。
在使用它们时,除了它们是Objects
.
而且,您会损失内存使用开销和装箱/拆箱时间。
实际上,我遇到过可以解释使用包装类的情况。
我创建了一个具有long
类型变量的服务类
- 如果变量是类型
long
- 未初始化时,它将被设置为 0 - 这将在 GUI 中显示时让用户感到困惑 - 如果变量是类型
Long
- 未初始化时,它将被设置为null
- 此空值不会显示在 GUI 中。
这也适用于Boolean
当我们使用原始值时值可能更容易混淆的地方boolean
(因为默认值为 false)。
集合是简单 Java 包装器对象的典型案例。但是,您可能会考虑在代码(值对象)中赋予 Wrapper 更具体的含义。
恕我直言,当归结为代码的可读性和维护性时,使用值对象几乎总是有好处的。当对象具有某些职责时,将简单的数据结构包装在对象内部通常可以简化代码。这在领域驱动设计中非常重要。
当然存在性能问题,但我倾向于忽略这一点,直到我有可能用适当的数据衡量性能并对有问题的区域采取更直接的行动。如果代码也易于理解,也可能更容易理解性能问题。
以数值计算为主的应用程序的性能可以从使用原语中受益匪浅。
原始类型,一种使用 == 运算符,但对于包装器,首选方法是调用 equals() 方法。
“原始类型被认为是有害的”,因为它们将“过程语义”混合到一个统一的面向对象模型中。
许多程序员将数字初始化为 0(默认)或 -1 来表示这一点,但根据具体情况,这可能是不正确的或具有误导性的。
如果要使用 Collections,则必须使用 Wrapper 类。
原始类型,用于数组。此外,表示没有行为的数据,例如,计数器或布尔条件。
自自动装箱以来,“何时使用原始或包装器”边界变得非常模糊。
但请记住,包装器是对象,因此您可以获得所有花哨的 Java 功能。例如,您可以使用反射来创建 Integer 对象,但不能创建 int 值。Wrapper 类也有 valueOf 等方法。
如果要创建值类型。ProductSKU 或 AirportCode 之类的东西。
当原始类型(在我的示例中为字符串)定义相等时,您将需要覆盖相等。
何时使用原始类型
- 在进行大量计算时,原始类型总是更快——它们的开销要少得多。
- 当您不希望变量能够为空时。
- 当您不希望默认值为空时。
- 如果方法必须返回一个值
何时使用包装类
- 当您使用集合或泛型时 - 它是必需的
- 如果你想要一个类型的 MIN_SIZE 或 MAX_SIZE。
- 当您希望变量能够为空时。
- 当您希望默认值为空时。
- 如果有时该方法可以返回空值。
来自https://medium.com/@bpnorlander/java-understanding-primitive-types-and-wrapper-objects-a6798fb2afe9
Java 中的原始值不是对象。为了将这些值作为对象进行操作,java.lang 包为每个原始数据类型提供了一个包装类。
所有 Wrapper 类都是最终的。所有可以启动的包装类的对象都是不可变的,这意味着包装对象中的值不能改变。
虽然,void类被认为是一个包装类,但它不包装任何原始值并且不可初始化。它没有公共构造函数,它只是表示一个代表关键字 void 的类对象。