《Effective java》读书记录-第14条-在公有类中使用访问方法而非公有域

设计共有类时,坚持面向对象程序设计思想是正确的。如果类可以在它所在的包的外部进行访问,就提供访问方法,以保留将来改变该类的内部表示法的灵活性。

public class Point1 {
    public double x;
    public double y;
}
public class Point2 {
    private double x;
    private double y;

    public double getX() {
        return x;
    }

    public Point2 setX(double x) {
        this.x = x;
        return this;
    }

    public double getY() {
        return y;
    }

    public Point2 setY(double y) {
        this.y = y;
        return this;
    }
}
Point1暴露了它的数据域,将来如果要改变其内部表示法是不可能的,因为共有类的客户端已经遍布各处了;而Point2就不会出现这些问题了。

如果类是包级私有的,或者是私有的嵌套类,直接暴露它的数据域并没有本质的错误--假设这些数据域确实描述了该类所提供的抽象。

Java平台类库中有几个违反了“公有类不应该直接暴露数据域”的告诫。典型代表是java.awt.Point和java.awt.Dimension,这些都是反面例子。

让公有类直接暴露域从来都不是好办法,但是如果域是不可变的,那么危害会小点。就像下面的代码:

public class Time {

    private static final int HOURS_PRE_DAY=24;
    private static final int MINUTES_PRE_HOUR=60;

    public final int hour;

    public final int minute;

    public Time (int hour,int minute) {
        if(hour<0 || hour>HOURS_PRE_DAY)
            throw new IllegalArgumentException("Hour:"+hour);
        if(minute<0 || minute>MINUTES_PRE_HOUR)
            throw new IllegalArgumentException("Minute:"+minute);
        this.hour=hour;
        this.minute=minute;
    }
}
只有初始化的时候可以为hour和minute域赋值,其他的方法或者外部类都不能修改这两个域。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值