《Effective Java》笔记14:在公有类中使用访问方法而非公有域

如果类可以在它所在的包的外部进行访问,就将域设为私有的并提供域的访问与设置公有方法,以保留将来改变该类的内部表示法的灵活性。如果公有类暴露了它的数据域,要想在将来改变其内部表示法是不可能的,因为公有类的客户端已经遍布各处了。另外,如果不采取这种方式,则当域被访问的时候,无法彩任何辅助的行动。

如果类是包级私有的(虽然将域暴露了,但也只仅限于包含该类的包中,还在你可控的范围之内),或者是私有的嵌套类,直接暴露它的数据域并没有本质的错误——假设这些数据域确实描述了该类所提供的抽象。比如LinkedList中的Entry静态内部类,就暴露了所有的成员给外类了,这样用起来更简洁方便:

public class LinkedList{
    private static class Entry {
        Object element;
        Entry next;
        Entry previous;
    }
}

让公有类直接暴露域虽然从来都不是种好办法,但是如果域是不可变的,这种做法危害就比较小一些。如果不改变类的API,就无法改变这种类的表示法,当域被读取的时候,你也无法采取辅助的行动。

使用 getter setter 方法可以在方法中添加必要的验证逻辑,以避免非法数据。

public <T> boolean setXxx(int index, T value) {
    if (index > myArray.length)
        return false;
    if (!(value instanceof LegalClass))
        return false;
    ...
    return true;
}

总之,公有类永远不应该暴露可变的域。虽然还是有问题,但是让公有类暴露不可变域其危害比较小。但是,有时候会需要使包级私有的或者私有的嵌套灰来暴露域,无论这个类是可变还是不可变的。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:《Effective Java》笔记14:在公有类中使用访问方法而非公有域

文章字数:482

本文作者:Bin

发布时间:2018-08-25, 14:06:22

最后更新:2019-08-06, 00:43:03

原始链接:http://coolview.github.io/2018/08/25/Effective-Java/%E3%80%8AEffective%20Java%E3%80%8B%E7%AC%94%E8%AE%B014%EF%BC%9A%E5%9C%A8%E5%85%AC%E6%9C%89%E7%B1%BB%E4%B8%AD%E4%BD%BF%E7%94%A8%E8%AE%BF%E9%97%AE%E6%96%B9%E6%B3%95%E8%80%8C%E9%9D%9E%E5%85%AC%E6%9C%89%E5%9F%9F/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录