When I should go for wrapper class over primitive types? Or On what circumstance I should choose between wrapper / Primitive types?
If you want to use Collections, you must use Wrapper classes.
基元类型,用于数组。此外,还可以表示没有行为的数据,例如,计数器或布尔条件。
自从自动装箱以来,“何时使用原语或包装器”的界限变得相当模糊。
但是请记住,Wrappers 是对象,所以您可以获得所有有趣的 Java 特性。例如,可以使用反射创建 Integer 对象,但不能使用 int 值。包装器类也有类似 valueOf 的方法。
一般来说,应该使用基本类型,除非由于某种原因(例如放入集合)而使用 需要对象。即便如此,如果您希望最大限度地提高数值性能,请考虑一种不需要对象的不同方法。the documentation建议这样做,这篇文章演示了自动装箱如何导致较大的性能差异。
If you want to create a value type. Something like a ProductSKU or AirportCode.
当一个基元类型(在我的例子中是字符串)定义相等时,需要重写相等。
如果有必要,我只会使用包装类型。
在使用它们时,除了它们是 Objects这一事实之外,你并没有得到多少好处。
Objects
而且,您会减少内存使用开销和装箱/拆箱所花费的时间。
还有一些人提到,某些构造(如 Collections)需要对象,而且对象比它们的原始对应方(内存和装箱)有更多的开销。
Collections
Another consideration is:
将 Objects 初始化为 null或将 null参数发送到方法/构造函数中以指示状态或函数,可能很方便。这不能用原语完成。
null
许多程序员将数字初始化为0(默认值)或 -1来表示这一点,但是根据场景的不同,这可能是不正确或误导的。
这也将为 NullPointerException设置一个场景,当某些东西被错误地使用时,这比一些任意的错误更加方便程序员。
NullPointerException
集合是简单 Java 包装器对象的典型情况。但是,您可以考虑在代码(值对象)中赋予 Wrapper 更具体的含义。
恕我直言,当归结到代码的可读性和维护性时,使用值对象几乎总是有好处的。在对象中包装具有特定职责的简单数据结构通常可以简化代码。这在 Domain-Driven Design中是非常重要的。
当然存在性能问题,但是我倾向于忽略这个问题,直到我有可能使用适当的数据来衡量性能,并针对问题领域采取更有针对性的行动。如果代码也容易理解,那么理解性能问题可能也会更容易。
在我看来,如果我的类成员是包装器变量,它不依赖于默认值,这是开发人员友好的行为。
1.
class Person { int SSN ; // gets initialized to zero by default }
2.
class PersonBetter { Integer SSN; //gets initialized to null by default }
在第一种情况下,不能保持 SSN 值未初始化。如果在尝试使用该值之前未检查该值是否已设置,则可能会造成损害。
在第二种情况下,可以使用 null 初始化 SSN。这可能导致 NullPointerException,但是这总比在不初始化 SSN 字段的情况下尝试将默认值(零)作为 SSN 插入到数据库中要好。
以数值计算为主的应用程序的性能 可以从使用原语中获得很大的好处。
基元类型, 使用 = = 运算符,但对于包装器,首选方法是调用 equals ()方法。
“被认为有害的原始类型” ,因为它们将“过程语义混合到一个统一的面向对象模型中。
实际上,我曾经遇到过这样一种情况: 可以解释包装器类的使用。
我创建了一个具有 long类型变量的服务类
long
Long
这也适用于 Boolean,当我们使用基元 boolean时(因为默认值为 false) ,值可能更容易混淆。
Boolean
boolean
Java 中的基本值不是对象。为了将这些值作为对象进行操作,java.lang 包为每个基本数据类型提供了一个包装器类。
所有的包装类都是最终类。可以启动的所有包装类的对象都是不可变的,这意味着不能更改包装对象中的值。
尽管 无效类被认为是包装类,但它不包装任何基元值,并且不能初始化。它没有公共构造函数,只是表示一个表示关键字 void 的类对象。
When to Use Primitive Types
何时使用包装类
从 https://medium.com/@bpnorlander/java-understanding-primitive-types-and-wrapper-objects-a6798fb2afe9