封装的优点(学习 Java 编程语言 027)

class Employee {
    private String name;
    private double salary;
    private LocalDate hireDay;

    public Employee(String name, double salary, int year, int month, int day) {
        this.name = name;
        this.salary = salary;
        hireDay = LocalDate.of(year, month, day);
    }

    public String getName()
    {
        return name;
    }
    public double getSalary()
    {
        return salary;
    }
    public LocalDate getHireDay()
    {
        return hireDay;
    }

    public void raiseSalary(double byPercent) {
        double raise = salary * byPercent / 100;
        salary += raise;
    }

    ...
}

字段访问器: 字段访问器:只返回实例字段的访问器方法,例如 getName()、getSalary() 和 getHireDay() 方法。

字段更改器: 只设置实例字段的更改器方法。

name 是一个只读字段。一旦在构造器中设置,就没有任何办法可以对它进行修改,这样我们可以确保 name 字段不受外界的破坏。

salary 不是只读字段,但是只能用 raiseSalary 方法修改。特别是一旦这个值出现了错误,只需要调试这个方法就可以了。如果 salary 字段是公共的,破坏这个字段的捣乱者可能会出现在任何地方,那就很难调试了。

需要获得或设置实例字段的值,应该提供下面三项内容:

  • 一个私有的数据字段
  • 一个共有的字段访问器方法
  • 一个共有的字段更改器方法

只比提供一个简单的公共字段的好处:

  • 可以改变内部实现,除了该类的方法之外,不会影响其他代码。
  • 更改器方法可以执行错误检查,而只对字段赋值的代码可能没有这个麻烦。

警告 注意不要编写返回引用可变对象的访问器方法。getHireDay 方法违反了这个设定。

class Employee {
    private Date hireDay;
    ...
    public Date getHireDay()
    {
        return hireDay; // 坏的设计
    }
    ...
}

LocalDate 类没有更改器方法,与之不同,Date 类有一个更改器方法 setTime。

如果需要返回一个可变对象的引用,应该首先对它进行克隆(clone)。对象 clone 是指存放在另一个位置上的对象副本。

class Employee {
    private Date hireDay;
    ...
    public Date getHireDay()
    {
        return (Date)hireDay.clone(); // 好的设计
    }
    ...
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值