在public类中使用访问方法,而非公有域
这标题看起来真晦涩。。解释一下就是,如果类变成public的了--->那就使用getter和setter,不要用public成员。
要注意它的前提,如果是private的class(内部类..)或者package-private(default)的就无所谓。
退化类
退化类是只有实例域没有任何方法的类,
比如:
class Point {
public double x;
public double y;
}
退化类应该是私有的或者是包级私有(package-private)的,因为退化类违反了面向对象的封装原则,暴露了实例域,所以要控制这种类的访问级别。
具体点说,如果退化类是公有的,一旦发布出去就再也不可以修改,比如把x改为a都是不可以的,因为会影响到其他使用该退化类的类(*笔者注:所以说如果代码只有你一个人用,不用发布,也就不存在封装)。
EJ上说,如果类可以在它所在的包外部进行访问,就提供访问方法。以保留将来改变该类内部呈现的灵活性(to preserve the
flexibility to change the class’s internal representation.)。如果共有类暴露了数据域,将来改变
内部呈现就不可能了,因为client code已经被传播出去了。
在类需要public或者protect的访问级别时,应该把实例域变为private的,然后添加get和set方法。
另外,如果field是不可变的(final),那危害就小一些。
知乎上的一个回答:
来源:知乎 作者:仲晨链接:https://www.zhihu.com/question/21401198/answer/18113707
的确可以暴露,如果1. 所有内外代码都是你自己写;2. 这个模块再也不改了;3. 不会继承它,或者继承但不改变语义。David John Wheeler有一句名言:“All problems in computer science can be solved by another level of indirection.”getter、setter就是个很好的中间层。直接摘录stackoverflow上一个不错的总结:oop - Why use getters and setters?**这两个方法可以方便增加额外功能(比如验证)。
内部存储和外部表现不同。
可以保持外部接口不变的情况下,修改内部存储方式和逻辑。
任意管理变量的生命周期和内存存储方式。
提供一个debug接口。
能够和模拟对象、序列化乃至WPF库等融合。
允许继承者改变语义。
可以将getter、setter用于lambda表达式。(大概即作为一个函数,参与函数传递和运算)
getter和setter可以有不同的访问级别。