Item 14: In public classes, use accessor methods, not public fields

在public类中使用访问方法,而非公有域

这标题看起来真晦涩。。解释一下就是,如果类变成public的了--->那就使用gettersetter,不要用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可以有不同的访问级别。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容