在Java库中,Collection
接口不扩展Cloneable
和Serializable
接口的原因是什么?
2 回答
Collection
是一个接口,它指定一组称为元素的对象。如何维护元素组的细节取决于Collection
. 例如,一些Collection
实现List
允许重复元素,而其他实现Set
则不允许。许多Collection
实现都有一个公共clone
方法。但是,将它包含在Collection
. 这是因为Collection
是一种抽象表示。重要的是执行。在处理实际情况时,克隆或序列化的语义和含义会发挥作用执行; 也就是说,具体的实现应该决定它应该如何被克隆或序列化,或者即使它可以被克隆或序列化。在某些情况下,根据实际的支持实现是什么,克隆和序列化可能没有多大意义。因此,在所有实现中强制克隆和序列化实际上不太灵活且限制性更强。具体的实现应该决定它是否可以被克隆或序列化。
以下是 Oracle 文档中的解释:
许多 Collection 实现(包括 JDK 提供的所有实现)都会有一个公共的 clone 方法,但是要求所有 Collections 都需要它是错误的。例如,克隆由 TB 级 SQL 数据库支持的 Collection 意味着什么?方法调用是否应该导致公司申请一个新的磁盘场?类似的论点也适用于可序列化。
如果客户端不知道 Collection 的实际类型,让客户端决定所需的 Collection 类型,创建一个该类型的空 Collection,并使用 addAll 方法复制将原始集合的元素放入新的集合中。
因为如果是这样,那将要求所有Collection
实现都是Cloneable
and Serializable
,这比需要的限制更大。实现通常也实现这些接口,但接口并不Collection
需要它。