Builder模式中,为什么必须在对象域而不是builder域中检查参数?
来源:互联网 发布:js去掉最后几个字符 编辑:程序博客网 时间:2024/06/05 09:29
这个问题仅对于构造不可变类有意义,如果构造可变类,放在哪里都无法保障安全。
使用Builder模式构建不可变类ImmutableObj的实例imObj时,应该把字段的检查放在对象域。可以从两个角度分析:
- 如果放在builder域(一般是Builder#build()方法中),会存在TOC攻击,即:时刻T1参数检查通过,时刻T2修改其中可变的参数,时刻T3调用构造器,则时刻T3时,参数又变得不合法了。
- 如果放在对象域(一般是类的构造方法中),还要严格在完成所有字段的初始化之后(初始化之后就不可变了),再检查字段,从而彻底避免TOC攻击。如下:
public class ImmutableObj { private int[] nums; private ImmutableObj(int[] nums) { this.nums = nums.clone(); // 完成所有字段的初始化后再检查字段 checkArgs(); } private void checkArgs() { if (...illegal...) { throw new IllegalArgumentException("Illegal nums ...: " + Arrays.toString(nums)); } }}
当然,上述表述有些绝对了:如果参数本身就是不可变的,那么任何时候检查都是可以的。
PS:参数指Builder实例的成员变量,字段指ImmutableObj的成员变量。参数是相对于ImmutableObj的称法。
本文链接:Builder模式中,为什么必须在对象域而不是builder域中检查参数?
作者:猴子007
出处:https://monkeysayhi.github.io
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名及链接。
阅读全文
0 0
- Builder模式中,为什么必须在对象域而不是builder域中检查参数?
- 在Borland C++Builder中检查程序
- Builder模式创建对象
- mybatis中builder模式
- Solr4.6,用builder模式构建查询参数对象
- 创建对象之Builder模式
- 在实体对象上使用Builder模式应该注意
- Android中Builder设计模式
- android中AlertDialog-Builder模式
- Builder构造器模式在struts2中示例学习
- builder 模式
- Builder模式
- Builder 模式
- Builder模式
- builder模式
- builder模式
- Builder模式
- builder模式
- 树莓派开机自启动设置
- 【课程笔记】地图编绘_实验三 制图表达
- 16550芯片概览
- JSP学习之简介
- 同表两个字段二选一查询mysql中如何判断某一个字段是否存在某一个值
- Builder模式中,为什么必须在对象域而不是builder域中检查参数?
- Red Hat Enterprise Linux ISO 全镜像下载
- tomcat_javaweb项目域名打开网页是空白页面问题处理,但是加后缀可以访问
- 1. Two Sum
- 监控窗体按键,发送相应的串口信息
- Flink批处理优化器之成本估算
- 生成随机字符串
- eclipse adt 选择ndk目录时 出现“Not a valid NDK directory”
- Java仿Spring框架IOC控制反转利用反射简单实现(源码)