V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qua
V2EX  ›  Java

为什么有的 Java 程序员写代码只用包装类型?

  •  
  •   qua · 2022-01-01 22:13:45 +08:00 · 4533 次点击
    这是一个创建于 1051 天前的主题,其中的信息可能已经有所发展或是发生改变。

    方法的参数,返回类型,局部变量等等全用包装类型就是不用基本类型。有什么原因吗?

    17 条回复    2022-01-25 14:32:58 +08:00
    ifreeky
        1
    ifreeky  
       2022-01-01 22:26:45 +08:00
    先声明个人想法
    有时候 0 在某些结果中是有意义的,NULL 代表为空。然后就是个人习惯吧。。。
    xiaofan2
        2
    xiaofan2  
       2022-01-01 22:29:48 +08:00
    没有什么原因 个人习惯问题?
    基本类型还隐含了一个默认前提就是非 NULL 看不同场景吧
    seanzxx
        3
    seanzxx  
       2022-01-02 01:52:48 +08:00 via iPhone
    关键是 nullable 的区别,有些数据不可能是 null ,那就用原生类型,比如 count ,index

    定义 pojo 的时候,可能是 null 的字段用包装,不可能是 null 用原生

    全用包装可以看成一种简化方式,但多出一些 null 判断的 if 语句
    easylee
        4
    easylee  
       2022-01-02 03:44:12 +08:00
    此类问题也可以牵扯到所谓可见性修饰符乱用,明明适合 protect 或者是 default 的愣是全 private ,问为啥,就说是 Java bean 规范,相当无语。
    pengtdyd
        5
    pengtdyd  
       2022-01-02 04:34:03 +08:00
    这不很简单吗,因为有的人不能区分二者的区别
    xuanbg
        6
    xuanbg  
       2022-01-02 08:26:53 +08:00   ❤️ 2
    不用包装类,遇到空值怎么办?你账户余额 0 元和你没账户是一个结果,都是无法支付。但温度 0 度和没采集到温度可是完全两码事啊。诸如此类,实在是太多太多。。。
    fkdog
        7
    fkdog  
       2022-01-02 15:23:42 +08:00   ❤️ 3
    看标题的意思得出 lz 的目的主要是想拉一票人一起来 diss 这种写法的程序员。
    在实际应用里碰到数据库 select 、json 等反序列化情况可能会出现 null 值使用 primitive data type 导致的 NPE 问题。
    另外楼上也谈到了 null 值在许多场合的确是有实际语义的,用特殊值取代 NULL 的定义有时候反而是弄巧成拙。

    lz 这种就是经验不够但是又觉得自己很牛逼的那种。殊不知小丑竟是我自己系列。
    MMM25O7lf09iR4ic
        8
    MMM25O7lf09iR4ic  
       2022-01-02 16:46:35 +08:00
    为什么可以使用 private 的场景下会出现适合 protect 或者是 default 的情况。
    aguesuka
        9
    aguesuka  
       2022-01-03 17:24:59 +08:00
    因为 Java8 以前的理念使用 nullable 实现 sum types 或 product types
    jalena
        10
    jalena  
       2022-01-03 21:16:09 +08:00
    @fkdog +1
    iseki
        11
    iseki  
       2022-01-03 23:32:18 +08:00   ❤️ 1
    强烈反对用 0 false "" 这种值代替空值的行为,那就只能包装类了~~~
    chengyiqun
        12
    chengyiqun  
       2022-01-04 09:48:20 +08:00   ❤️ 1
    ![Snipaste_2022-01-04_09-47-33.jpg]( https://s2.loli.net/2022/01/04/ot4au3iKZsrFkBN.jpg)

    规范的做法就是如此.
    Chinsung
        13
    Chinsung  
       2022-01-04 11:53:22 +08:00
    请问,public int test(int a,int b,long c,boolean d){};
    这个方法在调用的时候报了空指针,是哪个参数还是返回?
    除非你能保证你的方法绝不可能返回 null 。
    不过换句话说,如果遇到处理不了的情况,返回一个 null 让上游做非空判断,和写死一个 0 或者-1 让上游写死判断,对上游来说并不会多几个字符。
    yinzhili
        14
    yinzhili  
       2022-01-04 12:59:34 +08:00
    很简单,对于数字来说,基本类型有默认值,包装类没有默认值,null 和 0 之间的区别很大
    cweijan
        15
    cweijan  
       2022-01-04 14:18:39 +08:00
    @chengyiqun 在阿里的规范出来前就一直是这个做法了, 阿里这个规范里面很多也是总结了之前 Java 开发的最佳实践, 作为一个参考就好了, 没必要当成圣经.
    Aresxue
        16
    Aresxue  
       2022-01-13 13:37:05 +08:00
    三态和两态的区别,我记得知乎上有人讨论过三进制其实更适合作为计算机的底层实现机制,只是历史已经走到这了。
    zhouwentong
        17
    zhouwentong  
       2022-01-25 14:32:58 +08:00
    @Chinsung 我的习惯是方法严入严出。
    内部接口,尽量不传递空,判空的操作交给调用方。外部接口是需要判空的,但也不会进行所谓的兼容空值操作。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   941 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:40 · PVG 06:40 · LAX 14:40 · JFK 17:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.