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

2023-09-08 15:58:49 +08:00
 Masoud2023

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

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

但 Java 没有 C#的 property ,又要统一格式,所以在不需要额外处理的地方也统一用 getter/setter 了。说到底这是糟粕,不需要过分解读。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/972072

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX