Java 爪哇语;方法序列化“;匿名类

Java 爪哇语;方法序列化“;匿名类,java,serialization,methods,Java,Serialization,Methods,假设我正在创建一个库,其中提供了一个优先级队列类。用户实例化一个并实现一个比较器接口,然后轻轻地将该接口传递给优先级队列。 我想: 1.允许用户轻松定义Comparator类,方法是将其实现为匿名类,如下例所示: PriorityQueue pq=new PriorityQueue(); pq.设置比较器(新比较器(){ @凌驾 公共整数比较(整数i1,整数i2){ 如果(i1i2)返回1; 否则返回0; } };); 2.允许用户序列化和反序列化优先级队列及其连接的比较器 3.只使用JDK来

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

1.允许用户轻松定义Comparator类,方法是将其实现为匿名类,如下例所示:

PriorityQueue pq=new PriorityQueue();
pq.设置比较器(新比较器(){
@凌驾
公共整数比较(整数i1,整数i2){
如果(i1i2)返回1;
否则返回0;
}
};);
2.允许用户序列化和反序列化优先级队列及其连接的比较器

3.只使用JDK来实现这一点,不使用其他外部库

实现这一目标的最佳方法是什么

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


感谢您提前提出的建议。

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

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


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

谢谢JB,我已经试着找到另一种方法来做这件事,因为它有一些缺点…不幸的是我没有,现在我会坚持你的建议,干杯
    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;
                }
             };);