递增原始包装器 class 作为参数传递给对调用者没有影响的方法

Incrementing primitive wrapper class passed as a parameter to a method which has no affect on invoker

我正在 Eclipse IDE 上编写 Java SE 8 应用程序。我遇到的问题如下。

private Object[][] adjustIndexTaskValueAdded(int size){
        Integer adjustingIndex = 0;
        Object[][] tasksDisplay = new Object[size][taskValues[0].length];

        for (int i = 0; i < size; i++) {                        
            tasksDisplay[i][0] = taskValues[i][0];//phase colour
            tasksDisplay[i][1] = identifyNextRowIDTaskTable(adjustingIndex, i);// the index
        }
       return tasksDisplay;
 }

所以,我得到了 adjustingIndex 整数包装器 class,我将其传递给 identifyNextRowIDTaskTable() 方法。这样局部变量可以存储在子方法中修改的值。

private String identifyNextRowIDTaskTable(Integer adjustingIndex, int currentRowID){
       if(UtilityOperations.isPhaseRow(phaseColourCurrent)){//it's a phase row
            adjustingIndex++;
            return "";
        }
        else{//it's a task row
            int displayID = tableID - adjustingIndex;
            adjustingIndex = 0;
            return String.valueOf(displayID);           
        }   
}

以上方法显示了修改我传递给的 Integer wrapper class 的方法。 现在,当我 运行 应用程序时,新值不会反映在调用程序方法中。看起来子方法的值 changes/adjusts ,但父方法看不到更改。最后,结果变成错误。

显示的源代码已简化...

所以,问题是什么? 我传的是引用类型var,不是递归操作。 当然,我可以使用对象的状态来存储值。然而,我想了解当前的陷阱。

此致

考虑

adjustingIndex++;

这是将 Integer 中的值拆箱以获得 int 并递增该值,这相当于:

int tmp = adjustingIndex.intValue();
tmp++;
adjustingIndex = Integer.valueOf(tmp);

这会将 参数 adjustingIndex 重置为对新整数的引用,它不会更改调用中 adjustingIndex 变量的值方法 - 这是一个单独的参考。

再次考虑:

adjustingIndex = 0;

这再次将参数 adjustingIndex 重置为对新整数的引用,它不会更改调用方法中 adjustingIndex 变量的值。

一种替代方法是使用 AtomicInteger

AtomicInteger adjustingIndex = new AtomicInteger(0);

增加

adjustingIndex.incrementAndGet();

使用

归零
adjustingIndex.set(0);

AtomicInteger 有方法改变它包含的整数的值,相比之下 Integer 是不可变的,它的值不能改变。