第76条 努力使失败保持原子性
通常来讲,调用方法失败了,应该使对象保持在被调用之前的状态
-
实现失败原子性的方法:
设计一个不可变的对象。如果对象是不可变的,失败原子性就是显然的。如果一个操作失败了,它可能会阻止创建新的对象,但是永远也不会使已有的对象保持在不一致的状态之中
-
在执行操作之前检查参数的有效性
public Object pop() { if (size == 0) throw new EmptyStackException(); Object result = elements[--size]; elements[size] = null; // Eliminate obsolete reference return result; }
对对象的临时副本执行操作,并在操作完成后用临时副本替换对象的内容
编写一段恢复代码(recovery code),由它来拦截操作过程中发生的失败,以及使对象回滚到操作开始之前的状态。这种办法主要用于永久性的(基于磁盘的(disk-based))数据结构
思考
- 我们的代码中有很多是不规范的,他们会在一个transaction中构造出来Domain对象,然后直接通过判断Domain对象的状态查看参数是否合理,不合理的话直接rollback transaction。这种做法是依赖了事务的原子性,我个人是不喜欢这种做法的。个人倾向于使用vo这种对象提前进行判断,通过了判断再创建Domain对象