当对象抛出异常后,我们希望这个对象的数据能保持抛出异常之前的状态,比如对象里面有个age的属性,之前值为20,这时候对象抛出了异常,我们希望异常后,这个对象的age值仍为20,而不是直接变为0。尤其是受检的异常,我们总是期望程序能尽量完美的运行下去,从异常中恢复后,保证数据不改变,不丢失。程序对象遇到了异常,但对象的属性值不应该改变,仍保持调用前的状态和值。具有这种属性的方法被称为具有失败原子性。
有几种办法能实现:
一、设计一个不可变的对象,意思就是每进行一步操作,程序都会创建一个新的对象,赋予最新的值。如果程序失败了,就不会创建新的对象,所以就保留了上一次创建的对象,对象中的值不会改变;我们只是创建新的对象,不停的赋予新的值,成功后才会替换老的对象,所以失败原子性就是显然的。
二、老方法,在操作之前检查参数的有效性,如果不合法,优先抛出异常或者不执行接下来的逻辑代码,这个要根据具体的业务逻辑来判断。
三、调整计算处理的过程,保证任何可能会失败的计算部分都在对象状态被修改之前发生。
四、开启类似于事务管理器的做法,如果程序没完全执行成功,就对代码的数据进行恢复,恢复到执行逻辑之前的模样,这个一般是数据库操作用的比较多。
五、对象进行clone,在一份临时拷贝的对象上执行操作,操作完成后,使用临时拷贝的的结果代替对象的内容,这也就是传说中的备份操作。
我们进行代码编程,要考虑性能和安全及代码逻辑的重要性,然后做出合理的选择。前三种方法应该比较常见。我们要注意使失败保持原子性。