Joh*_*ohn 7 java primitive autoboxing unboxing wrapper
参考:http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html
"如果你的程序尝试autounbox null,它将抛出NullPointerException."
如果尝试将null赋给布尔值,javac将给出编译时错误.说得通.尽管如此,将null赋给布尔值也是如此.我猜也是有道理的.
但是让我们考虑一下这样一个事实:当你尝试autounbox null时你会得到一个NPE.这意味着你不能在没有空值检查或异常处理的情况下安全地对布尔值执行布尔运算.在整数上进行数学运算也是如此.
很长一段时间,我是java1.5 +中自动装箱的粉丝,因为我认为它让java更接近真正的面向对象.但是,昨晚遇到这个问题之后,我得说我认为这很糟糕.当我尝试使用未初始化的原语时,编译器给我一个错误是一件好事.如果我输了,我不想使用自动装箱.
我想我可能误解了自动装箱的问题,但与此同时我永远不会接受布尔值应该能够有3个值.谁有人解释这个?我没有得到什么?
pol*_*nts 16
盒装类型是引用类型,所有引用类型,原始框或非引用框都可以参考null.这就是为什么Boolean可以参考null.一个人也可以Integer.所以可以String等等
盒装类型不是为了使Java真正面向对象而设计的.Java 永远不会是纯粹的面向对象的语言,你不应该编写代码,就好像这样.原始类型永远不会消失,事实上,只要有选择,它就应该是首选.
以下是Effective Java 2nd Edition的引用,第49项:首选原始类型为盒装基元(作者强调):
总之,只要您有选择,就可以使用原始优先于盒装原语.原始类型更简单,更快捷.如果你必须使用盒装基元,小心!自动装箱减少了使用盒装基元的冗长,但没有降低危险.当您的程序将两个盒装基元与
==运算符进行比较时,它会进行身份比较,这几乎肯定不是您想要的.当你的程序进行涉及盒装和未装箱原语的混合型计算时,它会进行拆箱,当你的程序进行拆箱时,它就会抛出NullPointerException.最后,当您的程序框原始值时,它可能导致代价高昂且不必要的对象创建.
我见过至少一个null值很有用的案例.Web服务中的大量数据对象具有可以为空的布尔字段.有时用户忽略包含值.在这种情况下,您希望能够从默认值中辨别出缺少值.以前,人们会写getX,setX和isXSet()方法,isXSet返回false,直到有人打电话setX.现在它可以X成为一个可以为空的类型,很明显,如果getX返回它就没有设置null.
除了这里所说的所有内容之外,还有一些情况下你非常希望得到布尔值的第三个值 - "可选"属性的情况.
我们通常会遇到数据库,其中布尔列允许空值.在不使用布尔值的情况下,我们需要使用两个单独的变量,一个指示值,另一个指示是否有效.
实际上,如果你看一下JDBC API,你可以看到这个问题的一个例子,如果列为空(例如,数字字段为0),则列获得默认值,然后你必须调用"wasNull"来检查它是真的0还是假的null!
自动装箱会自动在内部类型和对象类型之间转换数据类型。
布尔值的对象类型可以是Boolean.TRUE、Boolean.FALSE、 或null。这就是为什么您必须处理布尔值可能的 3 个值。
在数据库中,布尔类型通常具有三种状态。考虑一个跟踪某人是否通过课程的记录。TRUE 表示通过;FALSE 表示未通过,NULL 表示“当前正在上课”。是的,这很奇怪,但在面向对象编程中没有值是继承的。
我也觉得自动装箱有点令人反感,主要是因为它是编译器添加字节码来处理转换过程的功能。在我看来,这可能会导致人们忘记转换过程中的重要细节,而这些细节可能会更好地记住(例如您案例中的空处理)。它很有用,但不如 Java 语言的大多数其他功能有用。
就我个人而言,我希望将内在函数实现为轻量级对象而不是“内置”类型。很多时候混合内在/对象类型系统会产生阻碍。也就是说,内在函数应该是为了提高性能,但似乎如果您必须对对象编组执行大量内在函数,则您无法享受仅内在函数的性能提升。
| 归档时间: |
|
| 查看次数: |
9524 次 |
| 最近记录: |