2021/2/22 “Java中究竟为什么要使用get()和set()方法”

缘起:在初学java时我就想过get()和set()方法存在的意义究竟是啥,在实际代码编写时总感觉这东西可有可无...今天突然想起这个问题,于是在网上看了看,真的是众说纷纭呀..现在突然感觉有些东西真的不能深究,究完了也感觉意义不大(捂脸笑哭)

提前说一下啊…
关于这个问题每个人都有自己的观点,本文只是把我在探究过程中感觉比较有道理的东西总结一下,大神们轻点喷。

由于文章比较长,我先把我得出的结论写在开头,具体探究过程写在后面,如果有异议或者错误的地方,欢迎大家评论一起探讨。

① 究竟为什么要对private修饰的属性使用getset方法?(个人理解)

  1. 可以通过方法的途径来操纵属性的设值和取值,掌握控制权。
    (比如return特定格式的属性值,根据你自己需求去改造get或set中的限制)
  2. 可以设置属性权限。
    (例如只写get而不写set,该属性就只可读而不可写)
  3. 代码规范。
    (有点牵强…)

② 为什么在面向对象编程中对于private修饰的属性非要使用getset方法,而不直接使用public修饰属性?

  1. 提供类的人要尽量将类中有什么隐藏起来,只告诉使用者你能做什么(要尽可能把对象中的细节隐藏起来,服从面向对象编程的“封装性”)
  2. 使用类的人不关心你的类中有什么,只关心类提供了什么功能。
    所以设计类的时候要尽量不提供public的成员变量,最好一个都没有,只提供接口。这条原则其实不仅是代码规范的问题,放到工作中,这就是多项目组或多部门之间合作的准则,这也绝对不是某个独自编码的程序狼一拍脑袋就想出来,这是经历过有组织开发过工作的程序猿才能设计出来的。

首先我看到的第一篇文章是这个

Java 对类中的属性使用set/get方法的意义和用法
这个是他的正文:

1.灵活性
比如我们有一个Person类,我们给它设置一个属性name,但是我们希望在取名字的时候,不是只显示名字,而是把名字按我们的要求输出,比如”我的名字叫XX”,代码如下:
public class Person {
private String name;
public String getName() {
return “我的名字叫” + name;
}
public void setName(String name) {
this.name = name;
}
}
如上代码,以后我们只要定义一个person对象,并给他setName(xx),再getName的时候,就会显示我的名字叫XX。在实际业务中还可以有更灵活的运用,这里就不举例了。
2.安全性。
比如我们的操作系统在新建用户或在共享文件的时候,经常会提示对针对某个用户的权限是什么,是只读还是只写还是可读写,这里的读写就好比get/set。对于类来说,如果不使用set/get方法,直接用public定义某个属性,那么这个属性是可读可写的,如果你希望一个类的某个属性是只能读取,不能写入的时候,上面用public定义某个属性就不能满足了,但是我们可以使用private定义属性,再定义一个get方法,但是不定义set方法来实现。反之,只定义set,不定义get则表示该属性是只写不能读的。举个简单的例子,如下代码。
public class Circle {
private double radius;
private double pai = 3.14;
public double getPai() {
return pai;
}
public void setRadius(double radius) {
this.radius = radius;
}
/**
* 计算周长
/
public double getC() {
return 2
pai*radius;
}
}
我们定义了一个圆类,定义了属性半径和pai,半径我只提供写的方法,但是不提供读,而pai只提供读,但不能写,并提供了一个计算周长的方法getC。在实际项目中,对一些类的设计时,严谨的设计是要考虑哪些类是只读或是只写的。
set/get的方法作用当然不只这些,实际项目中的用法有很多,比如对某个类升级,有一个属性的Type变化了,只要set/get的Type不变就不会影响到以前的代码。更多的用法只能在使用中多体会了。

看完是不是感觉很有道理,这时就看到了一个评论:在这里插入图片描述
我说一下我的看法:这个评论杠的也不是没有道理,我感觉并不是作者说的不好,而是说他概括的灵活性和安全性这俩名字起的有点问题,他的“灵活性”我觉得应该用“可操作性”来说更好一些,至于安全性该概括成什么大家自己理解吧

之后我又看了第二篇文章:
java类中为什么设置set 和get 方法操作属性
这篇文章主要写了使用getset方法对属性进行操作的具体实例:

样例一:
class person {
public String name ;
public String sex ;
}
如上这么一个类我们可以对它的实体进行:
起名操作,如
person1.name = “小明”;
取名操作,如
person1.name;
样例二:
class person{
private String name;
private String sex;
public String getName(){
return this.name;
}
}
如上这个类,我们对它只有一种操作:
取名操作
person2.getName();
如果你还想有个起名操作,那就再设置一个set方法。
好了通过前面的两个说明例子,是不是悟到了什么呢,没错了!单纯的将属性公开那我们就失去了对这个类的操控能力,别人对这个属性进行设值取值都可以,你不想让别人设值都不行;而我们将属性隐藏,用方法去操控对属性的设值和取值,那么控制就在我们的手上了。如果这么说还不明白,我改一下上面第二个例子。
class person{
private String name;
private String sex;
public String getName(){
if(this.sex !=null && “女”.equals(this.sex)){
return this.name;
}else{
return “就不告诉你!”;
}
}
public void setName(String newName){
if(this.sex !=null && “女”.equals(this.sex)){
this.name=newName;
}
}
}上面改造的例子应该看明白了吧,属性私有了,只能通过方法去起或取名字,但并不是谁都能起名或取名成功的。方法中明确了,只有当实体人为“女”的时候你才能起名或取名。这只是个简单的例子,你也可以根据你自己需求去改造起名或取名中的限制。在此只是为了说明这么做是具有一种灵活性,可操作性。
从Java 编程思想的角度来讲,由于Java是面向对象编程,什么东西都是作为一个对象来讲,外部能看到摸到(操作和设置)的只有接口(对应对象中的公开方法)。为了圆这个思想,这个规范,属性就得私有了。其实每一个Java类都是由 属性+方法 构成的。我们对这个类的实例能动的只有方法。这种由思想规范写出来的类对类来说就比较安全;对调用这个类的人或是对象来说也比较省心,他只要关注你这个接口要传什么东西然后得到什么东西,你内部有什么属性怎么实现这个接口的,压根就不关心,多省事。 对了,这种思想学名"封装"。

这篇文章就很明确了,我们可以通过getset方法来掌握对属性的“控制权”,让他变成我们需要的样子(有点抽象,自行体悟)

最最后!我看到的这篇文章是真的很好,我们都有相同的疑问,他的探究之路也很值得我们学习,推荐阅读指数:★★★★★
关于面向对象编程中很多人用get()和set()方法,而不用public的一点总结

在很多程序中,都喜欢定义一个privata变量,然后为这个私有变量加上get(),set()方法。那为什么不直接定义一个public变量呢?这样做到底有什么好处和意义呢?难道真的仅仅只是为了代码规范?别逗了,不管你信不信,反正我是不信!带着这个问题我在网上寻找答案,真是众说纷纭啊,每个人都能说出一点点道理,但是却都不足以说服我!(所以在这里做一些总结,和大家分享,我们共同学习,共同进步。如果有什么想法和意见,也欢迎大家提出来,我们一起交流。)其中看到有这样一种说法:
   “get()和set()方法起到对外界封闭的作用,举个例子:假如你的裤兜里有很多钱,你肯定不会让别人都来掏,肯定只有自己能拿到,或者你拿出来给他,set和get就相当与你的手 而你类里的变量就相当与你兜里的钱,对于外面的人来说不知道你类里有什么他就知道调用这个get会给他一个什么东西”
  哇!貌似回答得很专业,很形象,很生动,很有道理啊,差一点我就要膜拜了,但是就在千钧一发的时刻,我冷静了下来。TNN的,差点就被你给忽悠了,这个举例完全没有回答实质性的问题嘛,会举例子的人伤不起啊~~~~(>_<)~~~~ 。如果一定要把get()和set()比喻成手的话,也不能比喻成你自己的手,因为get()和set()方法也是public属性的,谁都可以调用,也就是说任何人的手都还是可以拿到你的钱,那和直接把变量设成public有什么区别吗?至于对外面的人来说知不知道你类里有什么,这个只是变量命名规范问题而已,和属性不存在半毛钱关系吧?想让人看见和更改的变量就设成public,不想让人看见和更改的就设成privtata,已经很天衣无缝了,为什么还要get(),set()方法呢?
  我又迷茫了,带着依依不舍的心情,我离开了这位大神,继续寻找答案。其实每个人都知道get()和set()方法肯定是有好处的,但是有什么好处呢却又说不清楚,只能乖乖照做了(但是没有糖吃 哈哈!),而且工具可以帮你自动生成get()和set()方法,一点都不麻烦。但是不能因为不麻烦就傻傻的去做,而不去考虑为什么要这么做,那我们也沦落为了工具!⊙﹏⊙b汗!又偏题了,继续研究。。。
   其实大多数人讲的是这关系到安全性的问题,貌似有点道理,但是却好象没什么依据,请问我使用public变量有什么不安全? 使用get(),set()安全在哪里?
   有些人说封装性,但是变量本身就是封装在类里面的啊!
   其实大部分人都是人云亦云,说什么安全性,封装性,只要学java的人都会说,没有一本java的书不提及这些名词, 其实真正理解的人不多。
   我只知道用get()和set()有一个好处,当输入.get(.set) 时就能显示所有的属性。把所有设置都归纳起来,对于外部的使用都方便而已。假如你开发一个类给别人用,人家只要输入.get就能知道所有的属性。 (天啊!就只有这么一丢丢的好处?我都不好意思跟别人说!)  
  难道get()和set()真的只是一种规范做法而已,完全等效于public变量?
  不!我这种人是绝对不甘心找不到答案就把问题归结于代码规范的!
  那我想现在唯一可以让我信服的答案暂时就是:用get()与set()可以控制变量。
   如果get()和set()方法里面只放一个赋值语句的话,和public变量应该没什么区别。
  但是设想,如果你的变量score代表的是一个学生的数学成绩,理论上,分数只可能是0-100的整数,如果你把将score设为public,不用get()和set(),那么用户很可能会输入1-100以外的数字,如果你把将score设为privata,再用setScore()来设置分数,你就完全可以控制这种行为了。
   哈哈 其实几句话可以把这个问题搞定,但是为了把文章写得生动一点,废话多了一点点,请大家见谅!如果大家还知道get()和set()有什么其他的好处的话,指教小弟一下,感激不尽!
   —————————————————————————————————
使用get()和set()而不使用public的成员变量,是因为我们设计类的时候要遵循这样的原则:
提供类的人要尽量将类中有什么隐藏起来,只告诉使用者你能做什么
使用类的人不关心你的类中有什么,只关心类提供了什么功能
所以设计类的时候要尽量不提供public的成员变量,最好一个都没有,只提供接口
这条原则其实不仅是代码规范的问题,放到工作中,这就是多项目组或多部门之间合作的准则
这条原则也绝对不是某个独自编码的程序狼一拍脑袋就想出来,这是经历过有组织开发过工作的程序猿才能设计出来的。
—————————————————————————————————
这个问题其实很简单,比如
setAge(int age){
if(age<1||age>120)
throw new Exception(" 你输入的年龄不合法");
}else{
this.age=age;
}
这个是public变量做不到的,安全是其中一个原因,另外楼主你要是学过Hiberante和Spring的话,就会知道
一些类的变量,即使是public的,也必须写上set方法,否则就出错,框架设计的时候就这么要求的
所以别人都这么做的时候,你这么做只会有好处而不会有坏处,这就是标准

三篇文章看完,我自己对于我提出的问题心里也有了个数,很建议大家自己去原贴再好好看看,尤其是评论区杠出来的问题,我们也可以去设身处地的去想一想,当然,有些问题还是不要深究为好,知道怎么用就行,除非你也像我一样那么闲(笑哭)。

菜鸟进步之路,甚是辛苦。

猜你喜欢

转载自blog.csdn.net/qq_47354826/article/details/113956284#comments_27366846