匿名类的Java "method serialization"

标签 java serialization methods

假设我正在创建一个库,其中提供了一个优先级队列类。用户实例化一个并实现一个 Comparator 接口(interface),然后将该接口(interface)轻轻地传递到优先级队列。 我想:

1. 允许用户轻松定义 Comparator 类 - 通过将其实现为匿名类,就像这个示例所建议的那样:

    PriorityQueue<int> pq = new PriorityQueue<int>();
    pq.setComparator(new Comparator<int>() {
                @Override
                public int compare(int i1, int i2){
                     if(i1 < i2) return -1;
                     else if(i1 > i2) return 1;
                     else return 0;
                }
             };);

2. 授予用户序列化和反序列化优先级队列及其附加比较器的可能性。

3. 仅使用 JDK 实现此目的,没有其他外部库

哪种方法最适合实现这一目标?

目前我在反序列化 Comparator 类时遇到问题,更具体地说是创建它的一个实例,因为它在创建它的类中是私有(private)的(“拥有”它)并且它也没有空构造函数(这是这不是什么大问题,因为我可以使用它公开的可用构造函数)。

提前感谢您的任何建议。

最佳答案

记录类,说明要正确序列化队列,比较器应该是可序列化的,最好不是非静态内部类,因为这也会导致其封闭对象的序列化。当然,还要记录在反序列化队列时比较器类必须可用的事实。

java.util.TreeSet 与您遇到的“问题”相同:它将比较器作为参数,将其存储为内部状态的一部分,并且它是可序列化的。当您将不可序列化的比较器传递给 TreeSet 构造函数时,FindBugs 会生成警告。

我不认为你能做得比这更好。

关于匿名类的Java "method serialization",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13783134/

相关文章:

java - 如何将 Spring 4 与 Apache Tiles 3 集成?

java - 无法将 Spring Boot 应用程序启动到 Linux 服务器

java - 使用 Jackson 的 JSON 数据特殊字段

django - 如何在我的 HyeprlinkedModelSerializer 中使用自定义序列化器字段

java - 我是否必须为调用方法的计数器创建整数?

c# - 读取方法属性的值

java - 如何获取列表中的所有项目

java - 如何使用 Java 枚举实现 "cyclic"FSM

c# - 防止基类序列化

javascript - 如何使用 .match javascript 方法来搜索数组和字符串?