java - 使用比较器作为嵌入类,母类(在克隆中初始化)字段在比较方法中不可见

标签 java clone inner-classes comparator

我开发了一种名为 CCMN 的服务器到服务器协议(protocol),并为每个服务器缓存的消息提供了不同的丢弃策略。 PEERSIM模拟器使用CCMN协议(protocol)创建一个模板节点,然后克隆该模板节点。

CCMN 类包括维护实现丢弃策略所需状态的不同数据结构。例如,Pmap 将内容标识符解析为内容对象,freq 将内容标识符解析为内容对象已使用的次数。

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

这些数据结构的初始化是在CCMN的clone方法中完成的。为了支持删除策略,我使用了一个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 比较(字符串 s0,字符串 s1){ if(freq.get(s0) > freq.get(s1)) 返回 1; 否则 if(freq.get(s0) < freq.get(s1)) 返回 -1; 否则返回0; } }

问题是当我调用时遇到 NullPointerException 异常:

raw_drop.add(ct.getID());

通过调试,我发现添加对第一个元素有效,但是当添加第二个元素时出现异常。我将异常追溯到比较方法,通过检查变量,我发现 freq 变量(以及在克隆方法中初始化的其他变量)等于 null,而变量在构造函数中定义的都是明确定义的。

此外,我检查 freqadd 调用之前是否已正确初始化。

我猜想比较器作为嵌入类的定义和克隆方法之间存在问题。

欢迎任何帮助。

问候,穆罕默德

最佳答案

好的,但这不会改变任何问题,因为问题是 freq 没有​​在比较方法中初始化......

关于java - 使用比较器作为嵌入类,母类(在克隆中初始化)字段在比较方法中不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3650809/

相关文章:

Java 内部类

java - 如何在 while 循环中验证多个数据?

java - 递归算法在一定深度后停止工作

java - 负字符串长度

linux - 通过从原始 svn 仓库中获取所有 svn 部分来克隆一个 git-svn 仓库

java - 使用内部类来评估复选框事件不起作用

java - JSF 中的 "Target Unreachable, identifier ' UserBean ' resolved to null"

javascript - JQuery ui Slider 不能处理重复项

javascript - jQuery.extend() 深度克隆嵌套对象

java - 是否鼓励(或不)在 Android 开发中使用内部类?