代码之家  ›  专栏  ›  技术社区  ›  Tel lui

为什么更新匿名类的方法引用的基元实例变量值不会更新其方法中的值?

  •  0
  • Tel lui  · 技术社区  · 2 年前

    以下是我在维护旧应用程序时遇到的一个问题,下面是演示代码: 首先,我创建了一个类,其中字段innerComp由匿名类的实例和字段adjustNum赋值,该字段用于innerComp:

    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。有一个我不知道的知识缺失,希望有人能帮忙。非常感谢。

    (更新) 如前所述,拼写错误会造成混乱。我已经修复了代码 注释掉原始代码。

    0 回复  |  直到 2 年前
        1
  •  1
  •   Davide Lorenzo MARINO    2 年前

    我在您的代码中至少发现了一个错误:

    public void setAdjustNum(int adjustNum) {
        adjustNum = adjustNum;
    }
    

    此方法不执行任何操作,因为它重置了作为参数传递给函数的adjustNum。如果需要设置类的adjustNum字段,则必须将代码更新为

    public void setAdjustNum(int adjustNum) {
        this.adjustNum = adjustNum;
    }
    

    所以 this.adjustNum 指实例的属性,而 adjustNum (没有这个)是指传递给函数的参数。在这种情况下,您确实设置了 adjustNum 使命感 setAdjustNum 方法