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

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

int max = obj.getMax();

int max = obj.max;

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

17519 次点击
所在节点    Java
185 条回复
qwertty01
2022-08-11 09:36:16 +08:00
不知道对一个十几年的老语言讨论个什么劲。
很明显就是历史遗留问题。

现在的新程序员这么厉害了嘛?啥都不了解上来直接开始扯淡。

不过新程序员连个 java17 的 record 都不知道,真是世风日下。
iseki
2022-08-11 09:36:17 +08:00
直接用 field 意味着没有插入逻辑的机会,内部细节被直接暴露出去了。举个例子当你用动态代理时怎么办呢,field 就无法被代理
Miy4mori
2022-08-11 09:36:21 +08:00
钓鱼贴咋这么多人回复。。。
dr1q65MfKFKHnJr6
2022-08-11 09:36:52 +08:00
面向对象 3 大特征之一, 封装。java 没有‘只读’关键字,
对 pojo 来说,确实不方便,所以,有了 lombk 这玩意。
对于关系复杂对象来说,很有 必要。

动不动就抠帽子, 显得很 S *
LeegoYih
2022-08-11 09:38:14 +08:00
这也能争起来,感觉大家工作都不太饱和
magicyao
2022-08-11 09:38:35 +08:00
@beisilu 成员属性 get 和 set

1 、远古写法( C++)
public class Stduent
{
string name;

public string getName()
{
return name;
}

public void setName(string name)
{
this.name = name;
}

}

2 、中古写法

private string _Name;
public string Name
{
get
{
return _Name;
}
set
{
_Name = value;
}
}

3 、近代写法

public string Name
{
get
{
return Name;
}
set
{
Name = value;
}
}
Lambda 写法
public string Name
{
get => Name;
set => Name = value;
}

4 、懒狗写法
public string Name{get; set;}
daimubai
2022-08-11 09:41:03 +08:00
做访问控制和参数校验,以及避免误操作。从你举的例子来说有没有 get/set 是没多大意义的。
itechify
2022-08-11 09:41:49 +08:00
是的,你想咋样就咋样
wolfie
2022-08-11 09:42:49 +08:00
封装、继承、多态

子类可以 override 父类的 getxxx()
TateLiao
2022-08-11 09:43:26 +08:00
1. getter/setter ,可以在里面添加其他逻辑,例如校验、错误处理等等。假设人对象,有个 age 属性,不通过 setter ,随便赋值,1000 合理吗?
2. getter/setter ,从封装上来说,使用者有必要知道对象里封装了什么吗?通过 getter 去访问,允许暴露被外部的细节不更合适吗? setter 同理
3. getter/setter ,可对字段控制访问级别。例如:get 公开,set 私有 /保护
Oktfolio
2022-08-11 09:43:58 +08:00
那 JavaScript 这么丑陋的 proposal 是为了啥? https://github.com/tc39/proposal-class-fields
Oktfolio
2022-08-11 09:44:51 +08:00
Java 只是缺少了 getter setter 的语法糖
RedBeanIce
2022-08-11 09:47:07 +08:00
13 楼是对的
urlk
2022-08-11 09:47:32 +08:00
对 public 属性意义不大 , 但是你即想给别人用属性, 又不想让别人改 , 就得 private 封装一下, 提供方法给别人访问属性
Leviathann
2022-08-11 09:47:35 +08:00
@chaleaochexist 那为什么 C#和 js 都要做 get 和 set 关键字来实现这个行为但是简化一些,而不是直接暴露出去?
Leviathann
2022-08-11 09:49:50 +08:00
@magicyao 现代写法
class Student(var name)
所有的访问和赋值自动变成 getName 和 setName
wolfie
2022-08-11 09:52:20 +08:00
为什么一帮 Java 0 基础的在抢答。
listenerri
2022-08-11 09:52:50 +08:00
为长远计,避免以后要对成员变量做改动时,需要修改外部代码,所以干脆全用方法封装一下
dvsilch
2022-08-11 09:53:54 +08:00
getter setter 是合理的
不合理的是创建一个私有属性_property ,再用一个没有任何逻辑的 getter setter 去获取修改这个私有属性
chrisia
2022-08-11 09:55:56 +08:00
getter setter 能放逻辑,没有其他意义。因为 java 一开始没有语法层面的支持,所以只能写 getter setter 这种冗余的代码。现代语言例如 kotlin 直接在语法层面提供 getter setter 。

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

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

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

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

© 2021 V2EX