1

我正在使用 jgroups 作为中间件在 Java 中创建演示证券交易所分布式程序。Stock$1.class我的 Stock 类有一个优先级队列,它有一个比较器,结果Stock$2.classStock.class. Jgroups 只能发送可序列化的数据,但是根据我的理解$1.class$2.class内部类的结果,这些内部类是由于比较器而推断出来的,并且是不可序列化的,因此会导致 JGroups 出现异常,有人可以帮助我了解如何使它们也可序列化或其他一些 tweek 不使它看起来像内部类。

import java.io.*;
import java.util.*;
import java.io.Serializable;

public class Stock implements Serializable
{
    public String name;
    public String symbol;
    public int shares = 10000;
    public int price = 100;

    public PriorityQueue<Order> sellList = new PriorityQueue<Order>(100, new Comparator<Order>()
    {
        public int compare(Order oldOrder, Order newOrder)
        {
            int i = oldOrder.price;
            int j = newOrder.price;
            if(i > j)
                return 1;
            else if(i < j)
                return -1;
            else
                return 0;
        }
    }
    );

    public PriorityQueue<Order> buyList = new PriorityQueue<Order>(100, new Comparator<Order>()
            {
                public int compare(Order oldOrder, Order newOrder)
                {
                    int i = oldOrder.price;
                    int j = newOrder.price;
                    if(i > j)
                        return -1;
                    else if(i < j)
                        return 1;
                    else
                        return 0;
                }
            }
        );
}
4

1 回答 1

3

您的匿名内部类仅实现Comparator. 为了实现Comparator and Serializable,您应该将它们转换为静态嵌套类,例如

public class Stock implements Serializable {

    private static class OrderComparator implements Comparator, Serializable {
        public int compare(Order oldOrder, Order newOrder) {
            int i = oldOrder.price;
            int j = newOrder.price;
            if(i > j) {
                return 1;
            } else if (i < j)
                return -1;
            } else {
                return 0;
            }
        }
    }

    private PriorityQueue<Order> sellList = new PriorityQueue<Order>(100, new OrderComparator());
}

这不仅可以解决您的直接问题,而且还可以使代码更具可读性。

顺便说一句,上面的比较器可以更简洁地重写:

        public int compare(Order oldOrder, Order newOrder) {
            return oldOrder.price - newOrder.price;
        }
于 2011-04-22T21:00:51.383 回答