在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可以有不同的访问级别。