7.3封装隐藏
1. 信息隐藏是一种原则,而封装是实现这种原则的一种技术
2.抽象意味着用户可以从高层的接口来看待或者使用一类对象,而不用关心他的底层实现,而黑盒封装意味着用户不需要也无权访问底层
3.访问控制不仅是一种语法限制,也是一种语义规范--标有public的是接口,标有private的是实现,泾渭分明。
4代码例子
class Person{
private Date birthday;
private boolean sex;
private Person[] childrens;
public Person(Date birthday, boolean sex){
this.birthday = birthday;
this.sex = sex;
}
get,set (birthday,sex,childrens)
}
public int computeAge(){
}
}
<1>如果一个方法返回一个可变域对象的引用,无异于前门紧闭后门洞开。
<2>信息隐藏原则固然重要,但不是金科玉律。在一定条件也是允许的。比如,仅作为数据存储之用的类甚至可以开发所有的云域方法
又比如,在非同类之间共享或传递同一个引用有时是必要的,此外,在一定范围之内为提高效率也可以采取变通之法,避免对象复制
带来的性能损耗
<3>这也是给本班的精神论:第一设计很重要也不容易,需要研究精神
第二,任何人都会犯错误,包括权威,需要批评精神
<4>getChildren,应该返回复制后的数据,但如果用户经常需要获取某一指定位置的child,不妨提供getChild(int index)接口 , 视具体情况而定
还可以引入getchildCount,getFirstChild,getLastChild之类的接口,这样做的好处是:实现代码因较少复制数组而高效,客户代码因较少操作数据
而简洁,甚至连getchildren都不再需要
<5>作为一个建议,不妨将getSex换成 isMale 和 isFemale两个接口,这也提醒诸位,不要陷入追求get和set的对称。
<6>方法 computeAge的问题不在其实现,而是其命名,该名称暗示年龄是计算出来的--尽管的确是事实--》这暴露实现方法,应改为getAge
要知道,信息隐藏中的信息不仅仅是数据结构,还包括实现方式和策略。
<7>领会OOp的精髓绝非一早一夕之功,但若以抽象和封装为钥,必可早些通达。