参考CSDN博客:
1.关于面向对象编程中很多人用get()和set()方法,而不用public的一点总结 |
2.java里为什么要set/get方法? |
为什么我们不用student.name,而是用student.getName()?
set方法和get方法的意义在哪里?
常常使用set get,从不问及原因,突然思考起来,才发现自始至终都没明白。
其实看了这两篇博客也不一定会知道,最初使用set get的那个程序员是一个什么想法,但一定会通过思考,得到一个合理的解释,让下次使用set get时,不止是因为在项目开发的规范和框架的约束。
1. 从面向对象角度思考,设计类时需要考虑封装性
使用get()和set()而不使用public的成员变量,是因为我们设计类的时候要遵循这样的原则:提供类的人要尽量将类中有什么隐藏起来,只告诉使用者你能做什么。使用类的人不关心你的类中有什么,只关心类提供了什么功能。所以设计类的时候要尽量不提供public的成员变量,最好一个都没有。
举个例子,你有一块橡皮,你需要为这块橡皮提供一个方法叫做“得到橡皮()”,一个方法“使用橡皮()”,然后你才能在需要的时候“得到橡皮”、以及“使用橡皮”,否则,橡皮就只是橡皮,而不是工具。
只提供接口这条原则,其实不仅是代码规范的问题,放到工作中,这就是多项目组或多部门之间合作的准则,这条原则也绝对不是某个独自编码的程序猿一拍脑袋就想出来的,这是经历过有组织开发工作的程序猿才能设计出来的。
2. 从对变量的可控性角度思考,方便增加变量取得和设定时的特定条件
在为Student类设定name时,可能考虑项目开发时的业务要求,会像下面代码一样避免name为空的情况出现。这时,如果使用student.name来设定name的值,就会在每一次设定前都添加相应的判定处理,显然那样做会产生大量冗余代码,是不正确的做法
public void setName(String name) {
if (name == null || "".equals(name)) {
throw new IllegalArgumentException();
}
this.name = name;
}
以此类推,get时也是一样,如果遇到项目有共通的值编辑内容,有可能会出现下面的情况,这样也是要避免每一次编辑处理,所产生的不必要的代码,尽量精简的做法就是写在get方法中。
public String getName() {
if ("A".equals(loginusername) || "B".equals(loginusername))) {
return "优秀学生 "+name;
}
return name;
}