2012-12-08 37 views
6

Dire che sto creando una libreria che fornisce tra le altre cose una classe di coda di priorità. L'utente crea un'istanza e implementa un'interfaccia Comparator che viene quindi passata delicatamente alla coda di priorità. Voglio:Java "serializzazione del metodo" della classe anonima

1.concedere all'utente la possibilità di definire la classe comparatore facilmente - mediante l'attuazione di esso come una classe anonima, proprio come in questo esempio suggerisce:

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; 
       } 
      };); 

concedere all'utente la possibilità di serializzare e deserializzare la coda di priorità LUNGO con il suo comparatore collegato.

3.utilizzare solo JDK per raggiungere questo obiettivo, senza altre librerie esterne

Quale approccio sarebbe meglio per raggiungere questo obiettivo?

Attualmente sto avendo problemi di deserializzazione della classe Comparator, in particolare creando un'istanza di essa poiché è privata all'interno della classe che lo ha creato (che "lo possiede") e inoltre non ha un costruttore nullo (questo non è davvero un grosso problema dal momento che posso usare i costruttori disponibili che espone).

Grazie per eventuali suggerimenti in anticipo.

risposta

2

Documentare la classe, spiegando che per la coda da serializzare correttamente, il comparatore deve essere serializzabile e preferibilmente non una classe interna non statica, poiché ciò causerebbe anche la serializzazione del suo oggetto che racchiude. Documentare anche il fatto che la classe di confronto deve essere disponibile quando deserializza la coda, ovviamente.

java.util.TreeSet ha lo stesso "problema" di quello che si ha: prende un comparatore come argomento, lo memorizza come parte del suo stato interno ed è serializzabile. FindBugs genera un avviso quando si passa un comparatore non serializzabile a un costruttore TreeSet.

Non penso che tu possa fare meglio di così.

+0

grazie JB, ho provato a trovare un altro modo per farlo poiché presenta alcuni inconvenienti ... purtroppo non l'ho fatto e per ora rimarrò con i vostri suggerimenti, evviva –

Problemi correlati