论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
企业信息化/数字化
›
MES
›
软件构造-失败原子性
软件构造-失败原子性
雁过留声
金牌会员
|
2022-8-9 14:39:54
|
显示全部楼层
|
阅读模式
楼主
主题
973
|
帖子
973
|
积分
2919
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
在研读《Effective Java》时发现其中提出了“努力使失败保持原子性”的概念,笔者认为十分重要且有用,这里将其归纳整理后贴出,也作为读书笔记自用。
概念
当对象抛出异常之后,通常我们期望这个对象保持在一种定义良好的可用状态之中,基石失败是发生在执行某个操作的过程中间。对于受检异常(CheckException,必须捕获的异常)而言,这尤为重要,因为调用者期望能从这种异常中恢复。
一般而言,失败的方法调用应该使对象保持在被调用之前的状态。具有这种属性的方法被称为具有失败原子性。
实现方法
使用immutable对象
如果在发生异常时可能会创建新的对象,但是永远不会改变原有的对象,对象仍保持在被调用之前的状态。
对mutable对象在执行操作之前检查参数
类似软件构造课程上所说的checkrep()函数,检查可变对象的有效性(rep),在对象的状态被修改之前,先抛出适当的异常。
调整计算处理过程
调整计算处理过程的顺序,使得任何可能会失败的计算部分都在对象被修改之前发生。例如对于一个Map对象,它的元素被按照某种特定的顺序做了排序,为了向其中添加元素,该元素的类型就必须是可以在该规则下与其他元素进行比较的。如果企图添加类型不正确的元素,在Map被修改之前,首先会导致某种异常。
在拷贝的对象上操作
当需要对一个对象进行修改时,现在它的一份临时拷贝上执行操作,当操作完成后再用其中的结果代替对象的内容。
编写一段恢复代码(不常用)
编写一段恢复代码,用它来拦截操作过程中发生的失败,以及使对象回滚到操作开始之前的状态上。这种方法主要用于永久性的(基于磁盘的)数据结构。
其他
虽然失败原子性通常是可取的,但它并不总是可以实现的。例如,如果两个线程试图在没有适当同步的情况下并发地修改同一个对象,那么该对象可能会处于不一致的状态。因此,如果假定在捕捉到ConcurrentModificationException之后对象仍然可用,那就错了。错误是不可恢复的,所以方法在抛出AssertionError时,甚至不需要尝试保存失败原子性。
即使在可能存在实现失败原子性的情况下,也并非总是可取的。 对于某些操作,它会显着增加成本或复杂性。 也就是说,一旦你意识到这个问题,通常都可以自由而轻松地做到失败原子性。
总之,作为规则,任何生成的异常都是方法规范的一部分,应该使对象处于方法调用之前的状态。 违反此规则的地方,API文档应清楚地指出该对象将保留在哪种状态。遗憾的是,许多现有的API文档无法实现这一理想。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
雁过留声
金牌会员
这个人很懒什么都没写!
楼主热帖
XShell免费版的安装配置教程以及使用教 ...
阿里云体验有奖:如何将 PolarDB-X 与 ...
day02-代码实现01
【如何优化她】教你如何定位不合理的SQ ...
微服务大行其道的今天,Service Mesh是 ...
十年技术进阶路,让我明白了三件要事( ...
常用类-LocalDate、LocalTime、LocalDa ...
无需支付688苹果开发者账号,xcode13打 ...
鸿蒙3.0来了,这次,我真的想批评鸿蒙 ...
Elasticsearch 入门实战(5)--Java API ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
虚拟化与私有云
DevOps与敏捷开发
SQL-Server
网络安全
物联网
云原生
Mysql
移动端开发
前端开发
快速回复
返回顶部
返回列表