何时使用包装类和原始types

当我应该去原始types的包装类? 或者在什么情况下我应该selectwrapper / Primitivetypes?

其他人提到某些结构(如集合)需要对象,并且对象比原始对象(内存和装箱)有更多的开销。

另一个考虑是:

将Object初始化为null,或者将null参数发送到方法/构造函数来指示状态或函数可能会很方便。 这不能用原语来完成。

许多程序员将数字初始化为0(默认)或-1来表示这一点,但根据情况,这可能是不正确的或误导性的。

这也将设置一个NullPointerException的场景,当某些东西被错误地使用时,这比一些随意的错误更容易编程。

一般来说,你应该使用基本types,除非你需要某个对象(例如放入一个集合)。 即便如此,如果您想最大限度地提高数字性能,请考虑一种不需要对象的不同方法。 这是build议的文档 , 这篇文章演示如何自动装箱可以导致一个巨大的性能差异。

我只会使用包装types,如果你必须。

在使用它们的时候,除了它们是Objects的事实之外,它们并没有太多的收获。

而且,你在内存使用和盒装/拆箱所花费的时间上都会丢失。

在我看来,如果我的类成员是包装variables,它不依赖于默认值,这是开发人员友好的行为。

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字段,它会比不知不觉地将默认值(零)作为SSN插入到数据库中。

集合是简单的Java包装器对象的典型案例。 但是,您可能会考虑在代码(值对象)中给Wrapper一个更具体的含义。

恕我直言,几乎总是有利于使用价值对象,当归结为代码的可读性和维护。 当对象承担一定的责任时,将简单的数据结构封装在对象内部往往会简化代码。 这在领域驱动devise中非常重要。

这当然是性能问题,但我倾向于忽视这一点,直到我有可能用适当的数据来衡量性能,并针对问题领域采取更多的指导行动。 如果代码易于理解,也可能更容易理解性能问题。

以数值计算为主的应用程序的性能可以从使用原语中大大受益。

原始types,一个使用==运算符,但是对于包装器,首选的是调用equals()方法。

“原始types被认为是有害的”,因为它们将“程序语义混合成一个统一的面向对象的模型。

许多程序员将数字初始化为0(默认)或-1来表示这一点,但根据情况,这可能是不正确的或误导性的。

如果你想创build一个值types。 像ProductSKU或AirportCode。

当一个基本types(在我的例子中的string)定义相等,你会想要重写相等。

如果你想使用Collections,你必须使用Wrapper类。

原始types,用于数组。 此外,要表示没有行为的数据,例如计数器或布尔条件。

由于自动装箱,“何时使用原始或包装”边界变得相当模糊。

但请记住,包装器是对象,所以您可以获得所有的Java特性。 例如,您可以使用reflection来创buildInteger对象,但不能使用int值。 包装类也有方法,如valueOf。

实际上,我遇到过使用包装类的情况。

我创build了一个具有longtypesvariables的服务类

  1. 如果variables的types是long – 当未初始化时,它将被设置为0 – 这将在GUI中显示时混淆用户
  2. 如果variables是Longtypes的 – 当没有初始化的时候,它将被设置为null – 这个null值不会在GUI中显示出来。

这也适用于Boolean值,当我们使用原始boolean时,值可能会更混乱(默认值为false)。