何时使用包装类和基元类型

Gop*_*opi 87 java wrapper primitive-types

什么时候我应该去原始类型的包装类?或者我应该在什么情况下选择包装器/原始类型?

pst*_*ton 60

其他人已经提到某些构造,例如Collectionsrequire对象和那些对象比原始对象(内存和装箱)有更多的开销.

另一个考虑是:

将对象初始化为null或将null参数发送到方法/构造函数以指示状态或函数可能很方便.这不能用原语来完成.

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

这也将设置场景,以便NullPointerException在某些东西被错误地使用时,这比一些任意的bug更加程序员友好.

  • "将Objects初始化为null可能很方便".它不能方便,因为这是不正确的,如果该字段是可选的,您应该明确指出这一点. (15认同)
  • 大声笑@EddieJamsession谢谢,我永远不会再次初始化为null.(pfffft) (8认同)

Mat*_*hen 15

通常,除非出于某种原因需要对象(例如放入集合),否则应使用基本类型.即便如此,如果您想要最大化数字性能,请考虑不需要对象的不同方法.这是由文档建议,本文演示了自动装箱如何导致较大的性能差异.

  • 性能影响不是很大,代码易读性/可靠性应该退居二线. (2认同)
  • 首先,适当地使用原语不会使您的代码难以辨认.其次,在某些情况下,性能影响很大.说它永远不会是荒谬的. (2认同)

Cod*_*ody 11

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

1.

class Person {
   int SSN ; // gets initialized to zero by default 
}
Run Code Online (Sandbox Code Playgroud)

2.

class PersonBetter {
  Integer SSN; //gets initialized to null by default
}
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,您无法保持SSN值未初始化.如果您在尝试使用之前未检查该值是否已设置,则可能会受到影响.

在第二种情况下,您可以使用null初始化SSN.这可能会导致NullPointerException,但是无论何时尝试在不初始化SSN字段的情况下使用它,都会在不知不觉中将默认值(零)作为SSN插入到数据库中.

  • 构建器模式旨在解决这个问题.在这种情况下,如果在调用"build"之前未设置SSN以获取`Person`实例,则会创建一个抛出异常的`PersonBuilder`.我认为这种事情是过分的,但它是Java语言促进适当模式的东西. (3认同)

jjn*_*guy 7

如果必须,我只会使用包装器类型.

在使用它们时,除了它们之外,你不会获得太多收益Objects.

而且,你会减少内存使用的开销和装箱/拆箱所花费的时间.

  • 你可能收入不高,但你也不会失去太多.除非你在1990年的掌上飞行员身上跑步. (4认同)