何时使用包装类和原始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了一个具有long
typesvariables的服务类
- 如果variables的types是
long
– 当未初始化时,它将被设置为0 – 这将在GUI中显示时混淆用户 - 如果variables是
Long
types的 – 当没有初始化的时候,它将被设置为null
– 这个null值不会在GUI中显示出来。
这也适用于Boolean
值,当我们使用原始boolean
时,值可能会更混乱(默认值为false)。