6

優先キュークラスを提供するライブラリを作成しているとします。ユーザーはそれをインスタンス化し、 Comparator インターフェイスを実装します。これはその後、優先キューに穏やかに渡されます。したい:

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 クラスのデシリアライズに問題があります。より具体的には、それを作成した (「所有」している) クラス内でプライベートであり、null コンストラクターも持っていないため、そのインスタンスを作成する際に問題があります (これは実際には公開されている利用可能なコンストラクターを使用できるため、大きな問題です)。

事前にご提案いただきありがとうございます。

4

1 に答える 1

2

クラスを文書化して、キューを適切にシリアル化するには、コンパレーターをシリアル化可能にする必要があり、できれば非静的な内部クラスではないことを説明します。もちろん、キューを逆シリアル化するときにコンパレータークラスが使用可能でなければならないという事実も文書化してください。

java.util.TreeSetあなたが持っているものと同じ「問題」があります.コンパレータを引数として取り、それを内部状態の一部として保存し、シリアライズ可能です。直列化不可能なコンパレータを TreeSet コンストラクタに渡すと、FindBugs は警告を生成します。

それ以上のことはできないと思います。

于 2012-12-09T00:08:38.303 に答える