为什么大多数 Eclipse 集合类型都是可序列化的?

Why are most eclipse collections types Serializable?

我在这里寻找设计原理。

我可以理解使集合 类 可序列化是理所当然的事情,尽管 JCF 不这样做。尽管如此,ProcedureIntProcedure 等接口尤其是 not 成为 Serializable 的主要候选者,因为它们通常都是匿名的。

制作这些接口 Serializable 违背了 Josh Bloch 的建议,即接口应该很少扩展 Serializable[1].

我可能需要更新我的 Eclipse 首选项,以便不为每个匿名 Procedure.

发出串行 uid 警告

[1] 生效 Java 第二版。第 291 页

这个问题几年前就有人问过。我将尽我所能解释使 Eclipse Collections 中的所有功能接口扩展 Serializable 背后的设计原理。这个决定是在 15 年前做出的。注意:我是 Eclipse Collections 的创建者。

Eclipse Collections 自 2004 年以来一直在开发中。它的开发生命周期始于 JDK 1.4。 Eclipse Collections 有函数式接口和一个函数式 API,十年前 Java 中有 lambdas 和 Streams 可用。为了将 Eclipse Collections 的函数式 API 与之前的函数式接口一起使用Java8、我们经常要创建匿名内部classes.

我们需要在专有的分布式缓存架构中序列化缓存之间的功能接口,并且偶尔将它们序列化到磁盘。 Java 8 中的 Java 语言添加了交集类型以支持 serialization of lambdas。在 Java8 之前,我们必须选择单一接口或 class 来实现匿名内部 class。如果我们用于匿名内部 class 的功能接口不是 Serializable,我们无法在不创建扩展功能接口的命名 class 的情况下使其成为 SerializableSerializable.

我们考虑过的一种可能性是具有并行的功能接口层次结构。我们可以有一个 Function 接口,它不扩展 Serializable,然后添加第二个 SerializableFunction 接口,它会扩展 FunctionSerializable。分布式缓存 space 中有一些示例采用了这种具有并行层次结构的方法。例如 Oracle Coherence and Hazelcast 具有扩展 JDK 等效接口和 Serializable 的功能接口。如果我们在 Eclipse Collections 中这样做,它会使我们的功能接口类型总数(今天大约 500 个)增加一倍,达到近 1K 种功能接口类型。

最终,我们决定 Eclipse Collections 的最佳方法是让我们所有的功能接口简单地扩展 Serializable

Java 8 发布后,我们将@FunctionalInterface添加到我们的功能接口中,并更改它们以扩展JDK中的等效功能接口。这导致我们拥有 Serializable 版本的 JDK 接口,我们可以将其与 Eclipse Collections 和 Java Streams APIs.

一起使用

这里是 Eclipse Collections 中包含的所有对象和原始功能接口的链接。可以看出,由于支持原始集合上的功能 API,功能接口非常庞大。

Project Valhalla 交付并且对原语的泛型支持包含在 LTS(长期支持)Java 版本中时,我们最终将升级 Eclipse Collections 和 可能删除我们当前的大部分原始功能接口,因为它们不再是必需的。我说可能,因为这将是一个重大变化,会导致大量工作,并且需要 Eclipse Collections 的主要版本。更重要的是,它会影响所有当前的客户。