V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Masoud2023
V2EX  ›  问与答

Java 的 Pojo 为什么需要写 Getter/Setter?直接 public field 有什么缺点?突然忘了这个知识点

  •  
  •   Masoud2023 · 2023-09-08 15:58:49 +08:00 · 1288 次点击
    这是一个创建于 453 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我记得我最开始好像在哪看过这个问题,但是忘了答案是什么,v 友能不能提示下。

    14 条回复    2023-09-09 06:21:23 +08:00
    proxytoworld
        1
    proxytoworld  
       2023-09-08 16:00:41 +08:00   ❤️ 1
    限制修改
    impanghu
        2
    impanghu  
       2023-09-08 16:07:53 +08:00   ❤️ 1
    封装性
    jameszhangqk1
        3
    jameszhangqk1  
       2023-09-08 16:08:53 +08:00   ❤️ 1
    封装、多态、继承 🤣
    hidemyself
        4
    hidemyself  
       2023-09-08 16:10:52 +08:00   ❤️ 1
    因为很多三方框架会调用这几个方法。
    memedahui
        5
    memedahui  
       2023-09-08 16:19:47 +08:00   ❤️ 3
    这是 java 的基本特性封装性,如果你使用 public field,你不可以:1 在设置的时候进行校验,2 在取值的时候进行加强,而且如果你编写的是公用 api,别人就可以随意调用你的 Pojo 方法和属性,表面上你是失去了这个属性的控制权,实际上是你完全失去了对于 pojo 的控制权.比如你想让线程 Getter/Setter 里面 field 属性,你发现你已经做不到了.完整的教程在<EffectiveJava>第四章:类和接口
    aptupdate
        6
    aptupdate  
       2023-09-08 16:20:26 +08:00 via iPhone   ❤️ 1
    我记得这种叫贫血模型,为了减少耦合容易维护啥的,后面又搞出来一大堆 BO QO VO DTO 就这么延续下来了。
    bugDev
        7
    bugDev  
       2023-09-08 16:23:37 +08:00   ❤️ 1
    kotlin 的使用,var 和 val ,反编译会发现都是 private ,只是 var 会有 setter 和 getter ,val 只有 getter
    knightdf
        8
    knightdf  
       2023-09-08 16:33:29 +08:00   ❤️ 2
    你会把用户输入的数据直接拼接到 sql 里执行吗?不会对吧?这不是和 getter/setter 的道理一样么
    Masoud2023
        9
    Masoud2023  
    OP
       2023-09-08 16:51:53 +08:00
    @memedahui #5 看来有必要重读一次这本书了
    tairan2006
        10
    tairan2006  
       2023-09-08 17:09:21 +08:00
    缺点肯定有,不过你要是跟 Go 一样写,其实 public 也不是不行
    TWorldIsNButThis
        11
    TWorldIsNButThis  
       2023-09-08 17:12:12 +08:00
    你有没有发现过,field 是无法被 override 的?
    xtreme1
        12
    xtreme1  
       2023-09-08 17:14:20 +08:00
    方便在读写数据时下断点
    lambdaq
        13
    lambdaq  
       2023-09-08 17:22:28 +08:00
    方便日后偷袭。
    Rocketer
        14
    Rocketer  
       2023-09-09 06:21:23 +08:00 via iPhone
    应该是为了读写时顺便做点别的,比如给数组做个 deep copy 。

    但 Java 没有 C#的 property ,又要统一格式,所以在不需要额外处理的地方也统一用 getter/setter 了。说到底这是糟粕,不需要过分解读。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1934 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:29 · PVG 00:29 · LAX 08:29 · JFK 11:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.