Java 对象里为什么要用 get set?

2022 年 8 月 11 日
 dxatgp02

int max = obj.getMax();

int max = obj.max;

第二种写法不是更简单,更好理解?

19357 次点击
所在节点    Java
185 条回复
zxfeng
2022 年 8 月 11 日
写过两年 java 写过几年 c#(unity)

个人搬砖过程中驱动我主动去写 getter/setter (属性)的场景
1 某个属性只想被其他类读或者写
2 调试的时候方便;查找调用位置的时候,可以快速通过 ide 找到写或读的地方,比如某个值很少赋值但是有海量的读,通过快捷键找起来写的位置来比较麻烦。虽然有的 ide 也可以对成员读写位置区分,但这样能更快定位
3 可以在里面做一些操作,比如打印调用来源,检查 null ,写操作监听回调等等

缺点暂时就想起来一个
1 比如在属性 get 里用到了循环 /内存分配等影响性能等操作,但是调用属性的地方却很容易当作一个常量的值来频繁调用

至于设计原则啊模式啥的 没考虑过 可能层次还没有达到
tonymua
2022 年 8 月 11 日
封装,细化属性访问权限。
theniupa
2022 年 8 月 11 日
也没强制用呀,合适的时候用 public 也不是不行,就像我们自己写 jni 为了偷懒,就直接用 public field (🐶)
Oktfolio
2022 年 8 月 11 日
@realpg 这个是现在 Java Web 流行的失血模型导致的,CURD 才不会去思考那些,跟风就行了。
sinnosong1
2022 年 8 月 11 日
@realpg 我司项目里只有我写过一个数据校验。我还是 C#转过来的。😂
misaka19000
2022 年 8 月 11 日
@zxfeng #121 好奇怎么会既写 Java 又写 C#的呀,请问下是从 web 开发转行到游戏开发了吗?谢谢!😆
BigDogWang
2022 年 8 月 11 日
@guoqiao 我就想问你。一开始你觉得不需要访问控制,然后到处直接访问变量。突然有一天,这个属性需要访问控制了,你改起来蛋疼不。。。不同语言本身就有不同的设计和风格
sinnosong1
2022 年 8 月 11 日
@misaka19000 我是 java 后端,之前做 asp.net core ,我公司要做桌面端,我用 WPF 和 Avalonia 写了 Windows 和 Linux 的 2 个版本。会写 C#又会写 java 的应该挺多。。。
misaka19000
2022 年 8 月 11 日
@sinnosong1 #128 感觉 C#和 Java 不分家啊😂不过近几年 C#好像生态也好起来了,比以前要好了
Bingchunmoli
2022 年 8 月 11 日
哎,钓鱼
realpg
2022 年 8 月 11 日
@sinnosong1 #125
我从不写 java 还用过 setter
当然不是 everywhere
需要的时候 就把变量私有 必须 setter getter
setter 里可以监控谁修改了这个东西, 很多时候非常有必要

翻了全部楼, 都没见人说过这种用途, 感觉很多也就只是吹 JAVA, 根本也没太多生产项目用这些
zxfeng
2022 年 8 月 11 日
@misaka19000 一直游戏开发,刚开始的时候还没有 unity ,所以用一些开源引擎做,后来 unity 起来就转了
zxfeng
2022 年 8 月 11 日
@realpg 那啥 虽然我提了这个,但实际中也只是调试中或者监听后做一些轻度的操作。如果包含 io 等重操作或者导致很深的其他调用,写在这里调用的时候如果没有这个意识或者调用方不清楚里面的实现当作简单的赋值还是有一定风险
QingXuJiaZhi
2022 年 8 月 11 日
现在有了 record, 可惜有些第三方库还是只认 getXXX, setXXX, 不支持 record, 明明有好东西却不能用的感觉有点烦。
sinnosong1
2022 年 8 月 11 日
@realpg 我记得好像是个字符串设置值的时候写过,因为我感觉好像从来没有人这么在 java 写,但是在 C#应该挺多。
NeroKamin
2022 年 8 月 11 日
@codingbody #117 说的太好了,感觉现在写业务真的就是这样,一个 DAO 从数据库查数据在 Service 里处理处理就返回给 Controller 就完事儿了
misaka19000
2022 年 8 月 11 日
@zxfeng #132 哇🤩,居然没有 unity 的时候就开始写游戏了啊,那肯定是元老级的游戏开发工程师了👍
Chinsung
2022 年 8 月 11 日
你写业务逻辑,操作的全是实体类,确实必要不大,所以基本都是 lombok 生成
但是很多框架的扩展就是通过标准 setget 来让你方便知道你可以获取哪些东西可以设置哪些东西
再换句话说,难道全部用 getset 就没有一点好处吗?起码开头前缀统一吧,我.set 就可以提示所有我可以 set 的东西,get 也是一样
obj.max ,那我想知道他有哪些东西,哪些只读哪些可写,怎么才能比较好的处理呢?
acctv2
2022 年 8 月 11 日
@realpg 但如果你需要加入校验的时候,之前的类没有设计 setter ,你怎么解决呢?
loryyang
2022 年 8 月 11 日
按照实用主义来说,99%没有意义,但是也没啥坏处,现在 getter 、setter 都可以自动生成了,没啥成本

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

https://v2ex.ih06.com/t/872064

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

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

© 2021 V2EX