建议:在公有类中使用访问方法而非公有域。

有时候,可能会编写一些退化类(degenerate classes),没有什么作用,只是用来集中实例域:
 

// Degenerate classes like this should not be public!

class Point {

public double x;

public double y;

}

由于这种类的数据域是可以被直接访问的,这些类没有提供封装(encapsulation)的功能。如果不改变API,就无法改变他的数据表示法,也无法强加任何约束条件;当域被访问的时候,无法采取任何辅助的行动。坚持面向对象程序设计的程序员对这种类深恶痛绝,认为应该包含私有域和公有访问方法(getter)的类代替。对于可变的类来说,应该用包含私有域和公有设值方法(setter)的类代替:

// Encapsulation of data by accessor methods and mutators

class Point {

pirvate 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; }

}

毫无疑问,说到公有类的时候,坚持面向对象程序设计思想的看法是正确的:如果类可以在它所在的包的外部进行访问,就提供访问方法,以保留将来改变该类的内部表示法的灵活性。如果公有类暴露了它的数据域,要想在将来改变其内部表示法是不可能的,因为公有类的客户端代码已经遍布各地了。

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

Java平台类库中有几个类违反了“公有类不应该直接暴露数据域”的告诫。显著地例子包括java.awt包中的Point和Dimension类。他们是不值得仿效的例子,相反,这些类应该被当做反面的警告示例。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值