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

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

int max = obj.getMax();

int max = obj.max;

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

17522 次点击
所在节点    Java
185 条回复
xiao109
2022-08-11 09:56:19 +08:00
我不喜欢的一律都是垃圾
Edsie
2022-08-11 09:57:35 +08:00
Getter 、Setter 是标准的 Java Bean 定义写法
比如常见的 JSON 序列化,就是根据 Bean 定义进行转换的,也就是说即使没有 field 但是有个 getter 方法,也能序列化出这个字段
chrisia
2022-08-11 09:58:07 +08:00
@chrisia 也就是说,多数情况下认为 getter setter 是没有处理逻辑的(事实也是如此,你很少会在对字段操作的时候塞逻辑,特别是 data class 这种对象),少数情况下用特定的 getter setter 语法去处理。
startisan
2022-08-11 09:59:15 +08:00
Edsie
2022-08-11 10:00:21 +08:00
根本不是说,你需要写 getter setter
而是当你需要这个对象是一个 Java Bean 的时候,你就要符合 Java Bean 定义
pkoukk
2022-08-11 10:02:57 +08:00
c#的 getter 和 setter 就很优雅
可以直接使用 n1 = obj.Max ,obj.max=n1
但是如果只有 getter ,而你尝试 obj.Max=1 ,编译器会报错
sunhelter
2022-08-11 10:07:38 +08:00
大家别吵了,都来写.net
chrisia
2022-08-11 10:09:16 +08:00
@chrisia 还有一点比较重要,getter setter 可以有不同的访问级别,不过还是那句话,这些都是少数情况,我认为针对少数情况做处理才是好的选择,而不是迫使所有字段都采用 getter setter 。
zzzzz001
2022-08-11 10:10:05 +08:00
把控制权永远留给自己,大家维护多了,需求多了,业务复杂了,就知道这种好处了
yuezk
2022-08-11 10:13:21 +08:00
@pkoukk #66 是,但是本质上还是要提供 setter/getter 来操作内部的字段,C# 提供了一个比较好用的词法糖。

类似的,JS 也支持 setter 和 getter ,但使用上还是和 C# 一样,直接用点操作符。
zhangchongjie
2022-08-11 10:14:27 +08:00
一般.set .get 的原因是变量 private ,你该问为什么对象内要有私有属性, 如果都是 public 哪还需要,建议重学,别在这丢人现眼
dxatgp02
2022-08-11 10:20:16 +08:00
@dvsilch 就是这意思,就实体类还要写大量 set get.如果不想写用代码生成或 lombok. 不合理但不能问,问就是不喜欢不理解.
yuezk
2022-08-11 10:23:23 +08:00
搬运一个 SO 的回答,如果楼主真想了解的话可以点过去看看,就不在这里重复了,而且说的还没有人家好。https://stackoverflow.com/questions/1568091/why-use-getters-and-setters-accessors

如果你觉得使用 obj.setName() 不如使用 obj.name 方便,那只是语法层面的问题,和 geter/setter 无关。比如 C# 中就使用这种点操作符,但它底层还是会调用 setter/getter 的。
fkdog
2022-08-11 10:24:31 +08:00
其实 b=a.getB() / a.setB(b) 这种写法完全可以替代成 b=a.B / a.B=b
BearCookie
2022-08-11 10:26:49 +08:00
kotlin 可解
qq1009479218
2022-08-11 10:31:05 +08:00
充血模型
lisongeee
2022-08-11 10:32:14 +08:00
楼主的问题也可以是 java 为什么要写 99% 都用不到的 额外的 空的 一堆什么也不干的 setter/getter
shijingshijing
2022-08-11 10:32:35 +08:00
@yolee599
@nba2k9

所以 rust 这种最优雅了,一上来就是:听我说,大家都是狗。。。
Cbdy
2022-08-11 10:35:29 +08:00
可以作为方法引用,另一方面,方便调试
lancelock
2022-08-11 10:36:55 +08:00
你可以学学其他语言,尤其是比较新的一些,看看对这部分的处理。多看多用多比较自然就知道各种语言特性的用意在哪里

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

https://ex.noerr.eu.org/t/872064

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

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

© 2021 V2EX