假设我正在创建一个库,其中提供了其他优先级队列类。用户实例化一个并实现一个Comparator接口(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. 授予用户使用其连接的比较器对优先级队列ALONG进行序列化和反序列化的可能性。

3. 仅使用JDK来实现此目的,而无需其他外部库

哪种方法最好地实现这一目标?

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

感谢您提前提出任何建议。

最佳答案

记录该类,解释为正确地对队列进行序列化,比较器应可序列化,并且最好不是静态的内部类,因为这也将导致其封装对象的序列化。当然,还要记录以下事实:当反序列化队列时,比较器类必须可用。
java.util.TreeSet与您遇到的“问题”相同:它将比较器作为参数,将其存储为内部状态的一部分,并且可序列化。当您将不可序列化的比较器传递给TreeSet构造函数时,FindBugs会生成警告。

我认为您不能做得更好。

10-07 21:04