当我们作为一名java或Android开发人员把开发作为一种常态时,有没有考虑到我们在开发时忽视的一些细节常规问题;
那我们就谈谈javabean中的get()/set()和直接把成员变量public的区别;
首先我们先看看一篇别人眼中的区别:
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不变就不会影响到以前的代码。更多的用法只能在使用中多体会了。
看得如上说法,我对上面两点比较疑惑:
1.灵活性,我直接使用public,在使用变量的时候直接加上就ok了,想怎么加怎么加,效果一样;
2.你的安全性,我使用public对外直接提供,不适用get()/set()封装,效果一样,因为你的get()/set()也是public,如果你不想让外部使用,写出来就没有意义了,所以,安全不安全是相对的;
不过有看了这篇文章,感觉说的不错:
https://www.cnblogs.com/qingchen521/p/9192834.html
其实仔细想想,为什么习惯性的使用get()/set(),而不直接将成员变量public,是因为我们沿用java的思想,使用get/set是对变量的一个封装,仅此而已,而直接使用public却有点和c的面向过程有点类似了(注:本人学习浅薄,还望大牛多多指导,写的不好的多批评)