递增原始包装器 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
是不可变的,它的值不能改变。
我正在 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
是不可变的,它的值不能改变。