chapter3

Mutability和Immutability
改变变量:使变量指向存储着另一个值的空间

改变变量的值:变量指向的空间不变,变化的是存储的内容。

Immutability:不变性,一个重要的设计原则,设计ADT时尽量保证这个原则。

Immutable types:不可变的数据类型,当实例对象被创建以后,该对象的值就不可变化了,也就是该ADT中不能有mutator方法。

在编写程序的时候使用final关键字可以保证该变量不可再被改变,但不能保证该变量的值不变。所以,尽量使用final变量作为方法的输入参数、作为局部变量。

final类无法派生子类

final变量无法改变值/引用

final方无法被子类override(重写)

precondition前置条件:对客户端的约束,在使用方法时必须满足的条件
使用@param annotation说明每个参数的前置条件
postcondition后置条件:对开发者的约束,方法结束时必须满足的条件
使用@return annotation说明后置条件
使用@throws annotation说明出现异常的时候会发生什么
在方法声明中使用static等关键字声明,可据此进行静态类型检查
当客户端满足前置条件的时候,结果必须满足后置条件;当前置条件不满足的时候,方法内部可以做任何事情,但作为开发者,应该尽量让程序做到fail fast。

spec不能暴露实现细节,不应该暴露局部变量,也不应该暴露私有的数据域,这些东西一旦暴露,就有可能给被非法的程序员利用,发现漏洞并实施攻击。

ADT的操作
Creators构造器:用于使用 new 关键字创建一个新的对象。还有一种方法是静态方法,如Arrays.asList()、String.valueOf(Object Obj)等。

Producers生产器:用于使用一个存在的对象产生一个新的对象,例如String.concat()就是使用已存在的字符串构造出一个新的对象,而且不会改动原先存在的对象。

Observers观察器:不对数据做任何改动,只是查看一个已经存在的对象的各个值,如List.size()、所有的getter方法等。

Mutators变值器:用于改变对象属性的方法,如List.add()。mutator通常返回void,因为它不需要对外界做出反应,只是对ADT的数据域做了更改;mutator也可能返回非空,比如返回boolean表示修改成败等

Interface接口
接口可以实现静态方法,使用 static 关键字。

通过static关键字可以实现静态工厂方法,从而将接口的实现类封装,实现对外信息隐藏。

接口中也允许使用 default 关键字来定义并实现实例方法,这个应用有点类似于抽象类的功能。

通过default方法,在接口中统一实现某些功能,无需在各个类中重复实现它。

2. 继承和重写
子类可以继承父类的数据域和方法。

严格继承:子类只能添加新方法,无法重写超类中的方法。原因:父类中的方法使用了final关键字限定。

重写:子类的方法覆盖了父类的方法。重写的方法应该与父类方法有相同的签名,只有这样编译器才会判定为重写的方法。使用@Override annotation强制检查是否重写了超类中的方法。

在子类中如果想调用被重写的父类的方法,可以使用super.method()。

如果是在构造方法中调用父类的构造方法,则必须在构造方法的第一行调用super()。

posted @ 2021-07-07 15:19  SycpI  阅读(72)  评论(0)    收藏  举报