Effective Java 在公有类中使用访问 方法而非公有域

本文探讨了面向对象编程中封装的概念,通过对比无封装和使用封装的类,强调了封装在保护数据、允许未来修改类的内部表示及强加约束条件等方面的重要性。并给出了一个不可变对象Time的例子,说明在某些情况下,即使暴露不可变域,风险也相对较小。
摘要由CSDN通过智能技术生成
Class Point {
    public double x;
    public double y;
}

如上面Point类的数据域是可以直接被访问的,这样的类没有提供封装。如果不改变API,就无法改变它的数据表示法(比如,使用一个比double更高精度的类来表示x和y),也无法强加任何约束条件(比如以后我们可能会希望x和y不会超过某个值)。

 

复制代码

Class Point {
    private double x;
    private double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getX() { return x; }
    public double getY() { return y; }

    public void setX(double x) { this.x = x; }
    public void setY(double y) { this.y = y; }
}

复制代码

使用私有域和公有访问方法的公有类是比较合适的。在它所在的包的外部访问时,提供访问方法,以保留将来改变该类的内部表示法的灵活性。

 

如果类是包级私有的,或者是私有的嵌套类,那么直接暴露它的数据域并没有错误。对于包级私有类,这些代码被限定在包含该类的包中,如果有必要,不改变包之外的任何代码而只改变内部数据表示法也是可以的;对于私有嵌套类,改变的作用范围限定在外围类中。

 

让公有类暴露域不是好办法,但如果域是不可变的,这种做法的危害会较小:

复制代码

public final class Time {
    private static final int HOURS_PER_DAY = 24;
    private static final int MINUTES_PER_HOURS = 60;
    
    public final int hour;//hour是不可变域
    public final int minute;//minute是不可变域

    public Time(int hour, int minute) {//无法改变类的表示法,但是可以强加约束条件
        if(hour < 0 || hour > HOURS_PER_DAY)
            throw new IllegalArgumentException("Hour: " + hour);
        if(minute < 0 || minute >= MINUTES_PER_HOUR)
            throw new IllIllegalArgumentException("Minute: " + minute);
        this.hour = hour;
        this.minute = minte;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值