1.包装器得到的结果是不可变的,但不可变在运行阶段获得,编译阶段无法据此进行静态检查。
Collections.unmodifiableList
Collections.unmodifiableSet
Collections.unmodifiableMap
如图,当要改变listCopy时,静态检测无法检测,而是在运行时抛出异常。
2.除非规约要求或在后置条件声明,否则方法内部不应改变输入参数。
对于mutating ,应尽量不设计规约,以免引发bug。
Diagramming specifications:更强的规约,表达为更小的区域。更强的后置条件意味实现自由度更低;更弱的前置条件意味需要处理更多的可能输入,实现自由度变低,因此面积更小。
如上图所示,规约越弱,面积越大,最弱的ExactlyOne最大,而OneMore,AnyIndex强于ExactlyOne,因此在在后者的圈里。而无法比较规约强弱的两个则不能互相包含。
前置条件:
是否使用前置条件取决于
(1) check的代价;(2) 方法的使用范围
– 如果只在类的内部使用该方法(private),那么可以不使用前置条件,在使用该方法的各个位置进行check——责任交给内部client;
– 如果在其他地方使用该方法(public),那么必须要使用前置条件,若client端不满足则方法抛出异常