发布日期:2018-03-26
在JAVA中,为什么使用getters和setters方法?+ 查看更多
在JAVA中,为什么使用getters和setters方法?
+ 查看更多
发布日期:2018-03-10 13:56
分类:JAVA
浏览次数:160
使用getters和setters的好处是什么,只是get和set的话,而不是简单地使用这些变量的公共域?如果getters和setters一直比简单的get/set做的更多,我能很快地解决这个,但是我不能100%的清楚:
public String foo;
比下面的代码并不差多少?
private String foo; public void setFoo(String foo) { this.foo = foo; } public String getFoo() { return foo; }
而且前者花费的代码更短。
从一个Java Web开发者的角度来看,编译列表的内容对我来说就是赢家:
1.当你意识到你需要比设置或者得到值做更多的事情时,你没必要改变代码库的每个文件。
2.你可以在这里执行验证。
3.你可以改变正在被设置的值。
4.你可以隐藏内部的表现。getAddress()其实可以为你获得几个域。
5.你已经从表单之下的变化中隔离了公共的接口。
6.一些库需要这个。反射类、序列化类、模仿类。
7.继承这个类,你可以覆盖默认的函数。
8.你可以有不同的访问级别对getter和setter。
9.延迟加载。
10.人们会简单地告诉你不要使用Python。
1.当你意识到你需要比设置或者得到值做更多的事情时,你没必要改变代码库的每个文件。
2.你可以在这里执行验证。
3.你可以改变正在被设置的值。
4.你可以隐藏内部的表现。getAddress()其实可以为你获得几个域。
5.你已经从表单之下的变化中隔离了公共的接口。
6.一些库需要这个。反射类、序列化类、模仿类。
7.继承这个类,你可以覆盖默认的函数。
8.你可以有不同的访问级别对getter和setter。
9.延迟加载。
10.人们会简单地告诉你不要使用Python。
回答
其实有许多好的理由去考虑为什么使用访问器而不是直接暴露类的域——在封装的参数之外并且让未来的改变更加容易。
以下是我知道的一些理由:
- 行为的封装与属性的获得或者设置相关联——这使得日后增加额外的函数(想验证函数)更加容易。
- 用一个替代的表示暴露一个属性来隐藏这个属性的内在表示。
- 从你的改变中隔离公共的接口——当要求现有的功能保持不变的情况下,要改变实现的时候,可以允许公共的接口保持不变。
- 控制属性的生命线和内存管理——在不被管理的内存环境中特别重要(比如C++和Objective-C)。
- 在属性在运行时改变的时候提供了一个调试的接口——在没有这种方法的其他语言中,调试一个属性何时何地变成了某个特定的值非常的苦难。
- 对库互操作性的提高是针对属性操作设计的,getter/setters-可以想到模仿类、序列化类、WPF。
- 允许子类改变属性的表现形式并且通过覆盖getter/setter方法使其暴露。
- 允许getter/setter以lambda表达式的方式通过而不是值。
- Getters和setters允许不同的访问级别——比如get是公共的,但是set是被保护的。