面向对象三大特性之封装性

1、如何实现体现封装性

一个私有的数据域 ;
一个公有的域访问器方法 ;
一个公有的域更改器方法 ;

public class Test(){
        private String name;
        private Date date;

        public String getName( ){
                return    name;
            }
        public Date getDate( ){
                return    date;
            }
        public void setName(String name ){
                 this.name=name;
            }
        public void setDate(Date date ){
                this.Date=date;
            }

}

2、这样做的好处

     这样做要比提供一个简单的公有数据域复杂些 , 但是却有着下列明显的好处 :

      第一, 可以改变内部实现 , 除了该类的方法之外 , 不会影响其他代码 。 例如 , 如果将存储名字的域改为 :
               

String firstName ;
String lastName ;

那么 getName 方法可以改为返回

firstName + " " + lastName

对于这点改变 , 程序的其他部分完全不可见 。

       第二点, 更改器方法可以执行错误检查, 然而直接对域进行赋值将不会进行这些处理。 例如 , setName 方法可以检查姓名是否为数字或者其他特殊字符。

在此特别提出注意的一点:不要编写返回引用可变对象的访问器方法 。 在 Test 类中就违反了这个设
计原则 , 其中的 getDate 方法返回了一个 Date 类对象 。

       Date 对象是可变的 , 这一点就破坏了封装性 ! 请看下面这段代码 :

Test test = new Test();
Date d = test.getDate();
double tenYearsInMilliSeconds = 10 * 365.25 * 24 * 60 * 60 * 1000 ;
d.setTime(d.getTime()-(long)tenYearsInMilliSeconds); 

     出错的原因很微妙 。 d 和 test.date 引用同一个对象,对d调用更改器方法就可以自动地改变这个对象的私有状态 !!如图:

                            

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

 public Date getDate( ){
                return    (Date)date.clone();
            }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值