1

jgroupsをミドルウェアとして使用して、Javaでデモ証券取引所分散プログラムを作成しています。私の Stock クラスには、コンパレーターを持つ優先度キューがあり、結果はStock$1.classStock$2.classとともにStock.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 を実装するに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 に答える