为什么大多数 Eclipse 集合类型都是可序列化的?
Why are most eclipse collections types Serializable?
我在这里寻找设计原理。
我可以理解使集合 类 可序列化是理所当然的事情,尽管 JCF 不这样做。尽管如此,Procedure
、IntProcedure
等接口尤其是 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 的情况下使其成为 Serializable
和 Serializable
.
我们考虑过的一种可能性是具有并行的功能接口层次结构。我们可以有一个 Function
接口,它不扩展 Serializable
,然后添加第二个 SerializableFunction
接口,它会扩展 Function
和 Serializable
。分布式缓存 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 的主要版本。更重要的是,它会影响所有当前的客户。
我在这里寻找设计原理。
我可以理解使集合 类 可序列化是理所当然的事情,尽管 JCF 不这样做。尽管如此,Procedure
、IntProcedure
等接口尤其是 not 成为 Serializable
的主要候选者,因为它们通常都是匿名的。
制作这些接口 Serializable
违背了 Josh Bloch 的建议,即接口应该很少扩展 Serializable
[1].
我可能需要更新我的 Eclipse 首选项,以便不为每个匿名 Procedure
.
[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 的情况下使其成为 Serializable
和 Serializable
.
我们考虑过的一种可能性是具有并行的功能接口层次结构。我们可以有一个 Function
接口,它不扩展 Serializable
,然后添加第二个 SerializableFunction
接口,它会扩展 Function
和 Serializable
。分布式缓存 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 的主要版本。更重要的是,它会影响所有当前的客户。