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

2022-08-11 08:50:23 +08:00
 dxatgp02

int max = obj.getMax();

int max = obj.max;

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

14989 次点击
所在节点    Java
183 条回复
Macolor21
2022-08-11 08:52:16 +08:00
面向对象
xxxxxiong
2022-08-11 08:53:55 +08:00
访问控制
dxatgp02
2022-08-11 08:55:22 +08:00
@Macolor21 只是为用而用?教条主义?
chendy
2022-08-11 08:56:19 +08:00
java 世界的习惯,关注抽象(能 get/set 数据)而不是实现(有对应的字段保存数据)
好处是 get/set 方法里可以放逻辑,比如校验,比如 get 到一个计算出的数据,set 里修改多个字段
缺点是写起来确实麻烦,于是有了 lombok ,还有 kotlin 这种带语法糖的
dxatgp02
2022-08-11 08:56:37 +08:00
@xxxxxiong 同样的外部内获得 obj 这对象,用 getMax()和.max 有什么区别吗?
zed1018
2022-08-11 08:59:25 +08:00
教条主义罢了,后来 kotlin 的 data class ,java 的 record 类型都放弃了 getter setter 。甚至 kotlin 把 java 里的 getter/setter 都翻译成 field 访问了。
chaleaochexist
2022-08-11 08:59:36 +08:00
我不是 java 程序员.
=========
spring 或者是 spring 之前 EJB 带进来的概念. 美其名曰 java bean.
liufish
2022-08-11 08:59:57 +08:00
@dxatgp02
getMax()里面可能加一些方法,例如如果 max 是个 obj

getMax() {
if (max == null) {
// 异常逻辑,日志啥的
}
}

按照你的需要,业务需求来弄。

直接 public 的 max 也是 ok 的其实。看你们的习惯和代码规范了。
chaleaochexist
2022-08-11 09:00:12 +08:00
问下楼主是不是也是非 Java 程序员?
zed1018
2022-08-11 09:00:40 +08:00
即便不说后来的新东西,就是 java 里鼎鼎大名 lombok 的最主要的功能之一不就是生成这个吗。说到底就是大家都不乐意写,但是好像你不写显得就很不 pro 一样。
twofox
2022-08-11 09:04:25 +08:00
@dxatgp02 一个成员变量,我想在 set 的时候进行校验 /业务处理 /格式转换
那我是不是写个方法,obj.setValue()
但是总不能让别人改了随便赋值啊,得按照我的 setValue()来赋值,不然数据不对,那我设置为 private 很正常吧?
那我都设置为 private 了,你还怎么 int max = obj.getMax()?
yfugibr
2022-08-11 09:04:42 +08:00
@dxatgp02 get 和 set 可以对操作自定义,也可以分别赋予不同的权限,读写分离,限制了必须使用显式的赋值方法( set ),防止不经意的修改
zhuweiyou
2022-08-11 09:04:50 +08:00
getMax 里面还能写逻辑, 或者 只读.
如果你 obj.max 可能被 写入.
yule111222
2022-08-11 09:05:17 +08:00
没有任何意义。。。封装不是这么用的 2333
xiangyuecn
2022-08-11 09:05:40 +08:00
又长又臭,所以交给编译阶段去生成这些玩意,源码里眼不见为净
Macolor21
2022-08-11 09:06:24 +08:00
再说一个,封装。如果还说教条主义,还是不理解,那下面:

如果你是刚入门,看 Java 编程思想。
如果已经是老手,学会自己寻找答案

JavaBean 规范本身没问题,问题只在于语言级别没有语法糖,Java 17 加了 record
Building
2022-08-11 09:06:37 +08:00
写多了你就会发现,getter 和 setter 就是很有必要,很多语言你看到的 obj.max 也是在编译阶段帮你自动生成 getter ,当然你可以不用,但是一般语言都会有提供,有的甚至还有 willSet ,set ,didSet ,就算不提供,重复代码多了你也会自己写 getter 方法的
ligiggy
2022-08-11 09:06:41 +08:00
如果你是库作者,getter/setter 的好处是你封装的代码给别人用的时候体现的。

如果你只是自己用用,如果 ide 或者没有插件支持自动生成 getter/setter ,我觉得完全可以不用。

当然,如果你写 C#,属性是真的香惨了。
noe132
2022-08-11 09:07:16 +08:00
因为 java 没有像 C#的 getter/setter 只能用方法来模拟
makelove
2022-08-11 09:08:21 +08:00
java 没有内置属性语法,只能用 getXXX 代替,但.xxx 和.getXXX()又不一样,所以不管有没有逻辑全部无脑 getXXX,否则开始是.xxx 后加逻辑改 getXXX 就要改使用代码了,Java 的垃圾之处之一。

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

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

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

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

© 2021 V2EX