提问人:Tel lui 提问时间:6/15/2023 最后编辑:Tel lui 更新时间:6/16/2023 访问量:26
为什么更新匿名类方法引用的原始实例变量值不会更新其方法中的值?
Why updating a primitive instance variable value referring by the method of an anonymous class does not update the value in the method of it?
问:
这是我在维护旧应用程序时遇到的一个问题,以下是演示代码: 首先,我创建了一个类,该类的字段innerComp由匿名类的实例值,以及一个在innerComp方法中使用的字段adjustNum:
public class InnerComparator {
private int adjustNum = 0;
public InnerComparator() {
}
public InnerComparator(int adjustNum) {
this.adjustNum = adjustNum;
}
public void setAdjustNum(int adjustNum) {
// adjustNum = adjustNum;
this.adjustNum = adjustNum;
}
private Comparator innerComp = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
System.out.println(adjustNum);
return adjustNum;
}
};
public Comparator getInnerComp() {
return innerComp;
}
public void sort(List list) {
Collections.sort(list, innerComp);
}
}
这里演示了我如何使用它:
public class CheckInnerClassUpdate {
public static void main(String[] args) {
InnerComparator comparator = new InnerComparator();
List<String> list = Arrays.asList(new String[]{"1", "2", "3"});
comparator.sort(list);
comparator.setAdjustNum(1);
comparator.sort(list);
InnerComparator comparator2 = new InnerComparator(1);
// comparator.sort(list);
comparator2.sort(list);
}
}
结果是: 0 0 1 1 1 1
(已过时) 结果是: 0 0 0 0 0 0 我想问一下产生结果的机制。结果似乎表明,传递给匿名类实例的 adjustNum 引用了 adjustNum 的 init 值。在示例代码中,即使我通过构造函数传递值,传递给 innerComp 的值仍然是 0。我缺少一些我不知道的知识,希望有人能提供帮助。谢谢。
(更新) 如前所述,错别字会引起混淆。我已经修复了代码和 注释掉原始代码。
答:
1赞
Davide Lorenzo MARINO
6/15/2023
#1
我在您的代码中至少发现了一个错误:
public void setAdjustNum(int adjustNum) {
adjustNum = adjustNum;
}
此方法不执行任何操作,因为它重置作为参数传递给函数的 adjustNum。如果需要设置类的 adjustNum 字段,则必须将代码更新为
public void setAdjustNum(int adjustNum) {
this.adjustNum = adjustNum;
}
因此,引用实例的属性,而(不带此属性)引用传递给函数的参数。在这种情况下,您实际上设置了调用方法this.adjustNum
adjustNum
adjustNum
setAdjustNum
评论
0赞
Tel lui
6/16/2023
谢谢你,戴维德。我还发现最后一行没有像我想要的那样使用 comparator2。对不起,这个愚蠢的错误。
评论
public void setAdjustNum(final int adjustNum)
adjustNum = adjustNum
this.adjustNum = adjustNum;