При использовании компараторов в качестве встроенных классов поля родительского класса (инициализированные в клоне) не отображаются в методе сравнения. - PullRequest
1 голос
/ 06 сентября 2010

Я разработал межсерверный протокол CCMN и различные политики отбрасывания для сообщений, кэшируемых каждым сервером. Симулятор PEERSIM создает узел шаблона с протоколом CCMN, а затем клонирует этот узел шаблона.

Класс CCMN включает в себя различные структуры данных, поддерживающие состояния, необходимые для реализации политик отбрасывания. Например, Pmap разрешает идентификатор контента в объект контента, а freq идентификатор контента - количество раз, которое объект контента использовался.

public HashMap <String, Content> Pmap;
public HashMap<String, Integer> freq;

Инициализация этих структур данных выполняется методом клонирования CCMN. Для поддержки политик отбрасывания я использую priorityQueue, инициализированный компаратором, соответствующим используемой политике. В методе клонирования:

if(dp.equals(DroppingPolicy.LFU)){

lfu less_frequent = new lfu (); av.raw_drop = new PriorityQueue (1, less_frequent); } Компаратор объявляется следующим образом:

public class lfu implements Comparator<String> {

public int Compare (Строка s0, Строка s1) { if (freq.get (s0)> freq.get (s1)) возвращает 1; иначе if (freq.get (s0)

Проблема в том, что я получаю исключение NullPointerException при вызове:

raw_drop.add(ct.getID());

Путем отладки я обнаружил, что добавление работает для первого элемента, но исключение возникает при добавлении второго элемента. Я проследил исключение для метода сравнения, проверив переменные, которые я обнаружил, что переменная freq (и другие переменные, инициализированные в методе clone) равны null , тогда как переменные, определенные в конструктор четко определен.

Кроме того, я проверяю, что freq хорошо инициализируется перед вызовом add .

Я полагаю, что существует проблема между определением компараторов как встроенных классов и методом клон .

Любая помощь приветствуется.

С уважением, Мохамед

Ответы [ 2 ]

0 голосов
/ 07 сентября 2010

Я исправил проблему.Фактически, вложенные компараторы ссылались на экземпляр шаблона, а не на клонированный экземпляр.Я добавляю счетчик, чтобы первый раз метод, которому принадлежит инструкция raw_drop.add(ct.getID()), назывался priorityQueue, используемый экземпляром, инициализировался для правильной инициализации.

0 голосов
/ 06 сентября 2010

Хорошо, но это ничего не изменит к проблеме, потому что проблема в том, что freq не инициализируется в методе сравнения ...

...