Answers:
其他人提到某些结构(例如Collections
require对象),并且对象比原始对象(内存和装箱)的开销更大。
另一个考虑因素是:
将对象初始化为null
或将null
参数发送到方法/构造函数中以指示状态或功能可能很方便。使用原语不能做到这一点。
许多程序员将数字初始化为0(默认值)或-1来表示这一点,但是根据具体情况,这可能是错误的或令人误解的。
NullPointerException
当某些东西被错误地使用时,这也将为场景打下基础,这比程序中的一些任意错误更加对程序员友好。
通常,除非出于某种原因(例如放入集合)需要对象,否则应使用基本类型。即使这样,如果要最大化数值性能,也可以考虑使用不需要对象的其他方法。这是由文档建议的,并且本文演示了自动装箱如何导致较大的性能差异。
Integer
比更具可读性int
。
我认为,如果我的类成员是包装器变量,则它不依赖默认值,这是开发人员友好的行为。
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插入数据库要好。
PersonBuilder
如果在调用“ build”获取Person
实例之前未设置SSN,则将引发一个异常。我认为这种事情太过分了,但这就是Java语言提倡的正确模式。
如果需要,我只会使用包装器类型。
除了使用它们之外,使用它们不会带来太多收益Objects
。
而且,您会浪费内存使用量以及装箱/拆箱所花费的时间。
实际上,我遇到了可以解释使用包装器类的情况。
我创建了一个具有long
类型变量的服务类
long
-未初始化时将其设置为0-在GUI中显示时,这会使用户感到困惑 Long
-未初始化时将被设置为null
-此空值将不会在GUI中显示。这也适用于Boolean
当我们使用基本类型boolean
(默认值是false)时,值可能更令人困惑的地方。
集合是简单Java包装器对象的典型情况。但是,您可以考虑在代码(值对象)中赋予包装器更具体的含义。
恕我直言,将价值对象归结为代码的可读性和可维护性几乎总是有好处。当对象承担某些职责时,将简单的数据结构包装在对象内部通常会简化代码。这在领域驱动设计中非常重要。
当然存在性能问题,但是我倾向于忽略它,直到我有可能使用适当的数据来衡量性能并针对有问题的区域采取更有针对性的行动。如果代码也易于理解,则也可能更容易理解性能问题。
通过使用原语,可以大大受益于以数值计算为主的应用程序的性能。
基本类型,使用==运算符,但是对于包装器,首选是调用equals()方法。
“原始类型被认为是有害的”,因为它们将“过程语义”混入了其他统一的面向对象模型中。
许多程序员将数字初始化为0(默认值)或-1来表示这一点,但是根据具体情况,这可能是错误的或令人误解的。
如果要使用Collections,则必须使用Wrapper类。
基本类型,用于数组。同样,代表没有行为的数据,例如计数器或布尔条件。
自从自动装箱以来,“何时使用原始或包装器”边界变得非常模糊。
但是请记住,包装器是对象,因此您可以获得所有奇特的Java功能。例如,可以使用反射创建Integer对象,但不能创建int值。包装器类还具有诸如valueOf之类的方法。
如果要创建值类型。类似于ProductSKU或AirportCode。
当基本类型(在我的示例中为字符串)定义相等时,您将需要覆盖相等。
Java中的原始值不是对象。为了将这些值作为对象进行操作,java.lang包为每种原始数据类型提供了一个包装器类。
所有包装器类都是最终的。可以启动的所有包装器类的对象都是不可变的,这意味着不能更改包装器对象中的值。
虽然void类被认为是包装器类,但是它不包装任何原始值并且是不可初始化的。它没有公共构造函数,仅表示代表关键字void的类对象。