Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
effective-java-3rd-chinese
提交
a08bace3
E
effective-java-3rd-chinese
项目概览
OpenDocCN
/
effective-java-3rd-chinese
8 个月 前同步成功
通知
214
Star
9
Fork
4
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
effective-java-3rd-chinese
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
a08bace3
编写于
1月 18, 2020
作者:
S
sjsdfg
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix typo close #45
上级
06362dd1
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
1 addition
and
1 deletion
+1
-1
docs/notes/18. 组合优于继承.md
docs/notes/18. 组合优于继承.md
+1
-1
未找到文件。
docs/notes/18. 组合优于继承.md
浏览文件 @
a08bace3
...
...
@@ -42,7 +42,7 @@ s.addAll(List.of("Snap", "Crackle", "Pop"));
我们可以通过消除
`addAll`
方法的重写来“修复”子类。 尽管生成的类可以正常工作,但是它依赖于它的正确方法,因为
`HashSet`
的
`addAll`
方法是在其
`add`
方法之上实现的。 这个“自我使用(self-use)”是一个实现细节,并不保证在
`Java`
平台的所有实现中都可以适用,并且可以随发布版本而变化。 因此,产生的
`InstrumentedHashSet`
类是脆弱的。
稍微好一点的做法是,重写
`addAll`
方法遍历指定集合,为每个元素调用
`add`
方法一次。 不管
`HashSet`
的
`addAll`
方法是否在其
`add`
方法上实现,都会保证正确的结果,因为
`HashSet`
的
`addAll`
实现将不再被调用。然而,这种技术并不能解决所有的问题。 这相当于重新实现了父类方法,这样的方法可能不能确定
到底是否时
自用(self-use)的,实现起来也是困难的,耗时的,容易出错的,并且可能会降低性能。 此外,这种方式并不能总是奏效,因为子类无法访问一些私有属性,所以有些方法就无法实现。
稍微好一点的做法是,重写
`addAll`
方法遍历指定集合,为每个元素调用
`add`
方法一次。 不管
`HashSet`
的
`addAll`
方法是否在其
`add`
方法上实现,都会保证正确的结果,因为
`HashSet`
的
`addAll`
实现将不再被调用。然而,这种技术并不能解决所有的问题。 这相当于重新实现了父类方法,这样的方法可能不能确定
是否是
自用(self-use)的,实现起来也是困难的,耗时的,容易出错的,并且可能会降低性能。 此外,这种方式并不能总是奏效,因为子类无法访问一些私有属性,所以有些方法就无法实现。
导致子类脆弱的一个相关原因是,它们的父类在后续的发布版本中可以添加新的方法。假设一个程序的安全性依赖于这样一个事实:所有被插入到集中的元素都满足一个先决条件。可以通过对集合进行子类化,然后并重写所有添加元素的方法,以确保在添加每个元素之前满足这个先决条件,来确保这一问题。如果在后续的版本中,父类没有新增添加元素的方法,那么这样做没有问题。但是,一旦父类增加了这样的新方法,则很有可能由于调用了未被重写的新方法,将非法的元素添加到子类的实例中。这不是个纯粹的理论问题。在把
`Hashtable`
和
`Vector`
类加入到
`Collections`
框架中的时候,就修复了几个类似性质的安全漏洞。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录