在将原始值作为参数传递给新方法而不是引用后更新原始值
Updating original values after passing them as params to a new method instead of references
我有一个方法,它的某些部分是重复的。我设法以原始方法多次使用较小方法的方式拆分代码。问题是,当我将一些值作为参数传递给那些新的较小方法并使用它们时,原始值不会得到更新。我做的动作是:增值或从 arraylist 中删除项目。如何使用较小的方法更新原始值,而不仅仅是引用?我想出的唯一可能的解决方案是创建一个新的 class,我可以在其中为这些值创建一个 setter 并更新它们。但是有easier/straightforward种方法可以解决吗?
部分主要方法:
int numberOfBlocks = 0;
int currentBlock = 0;
int currentTime = 0;
ArrayList<Request> queue = new ArrayList<Request>();
if(queue.size != 0) {
updateStatus(queue, currentBlock, numberOfBlocks);
}
if(something else happens) {
removeFinished(queue, currentBlock);
}
更小的方法:
private void updateStatus(ArrayList<Request> queue, int currentBlock, int numberOfBlocks) {
if (queue.get(0).getBlock() > currentBlock)
currentBlock++;
else
currentBlock--;
numberOfBlocks++;
}
private void removeFinished(ArrayList<Request> queue, int currentBlock){
if (queue.get(0).getBlock() == currentBlock) {
queue.remove(0);
}
}
首先,如果您传递一个参数以便在方法中更改它,您的方法应该 return 更改后的值,这将解决您的问题。如果需要更改一个以上的值,那么你是对的,基元被传递了 y 值并且调用方法看不到被调用方法中所做的更改。因此,您应该将这些值封装在包装 class 中,并像您想要的那样使用 setter 和 getter。仅此一项就可以解决您的问题。但是对于 return 和 class 的方法也是有意义的,因为它已被修改。这只是一个很好的阶梯
如果较小的方法与主方法在同一个 class 中,则不要将它们作为参数传递,这些方法将使用 class 的字段。这是非线程安全的,但是你的 class 已经是非线程安全的了。
class MyClass
{
int numberOfBlocks = 0;
int currentBlock = 0;
int currentTime = 0;
ArrayList<Request> queue = new ArrayList<Request>();
void myMainMethod() {
if(queue.size != 0) {
updateStatus();
}
if(something else happens) {
removeFinished();
}
}
private void updateStatus() {
if (queue.get(0).getBlock() > currentBlock)
currentBlock++;
else
currentBlock--;
numberOfBlocks++;
}
private void removeFinished() {
if (queue.get(0).getBlock() == currentBlock) {
queue.remove(0);
}
}
我有一个方法,它的某些部分是重复的。我设法以原始方法多次使用较小方法的方式拆分代码。问题是,当我将一些值作为参数传递给那些新的较小方法并使用它们时,原始值不会得到更新。我做的动作是:增值或从 arraylist 中删除项目。如何使用较小的方法更新原始值,而不仅仅是引用?我想出的唯一可能的解决方案是创建一个新的 class,我可以在其中为这些值创建一个 setter 并更新它们。但是有easier/straightforward种方法可以解决吗?
部分主要方法:
int numberOfBlocks = 0;
int currentBlock = 0;
int currentTime = 0;
ArrayList<Request> queue = new ArrayList<Request>();
if(queue.size != 0) {
updateStatus(queue, currentBlock, numberOfBlocks);
}
if(something else happens) {
removeFinished(queue, currentBlock);
}
更小的方法:
private void updateStatus(ArrayList<Request> queue, int currentBlock, int numberOfBlocks) {
if (queue.get(0).getBlock() > currentBlock)
currentBlock++;
else
currentBlock--;
numberOfBlocks++;
}
private void removeFinished(ArrayList<Request> queue, int currentBlock){
if (queue.get(0).getBlock() == currentBlock) {
queue.remove(0);
}
}
首先,如果您传递一个参数以便在方法中更改它,您的方法应该 return 更改后的值,这将解决您的问题。如果需要更改一个以上的值,那么你是对的,基元被传递了 y 值并且调用方法看不到被调用方法中所做的更改。因此,您应该将这些值封装在包装 class 中,并像您想要的那样使用 setter 和 getter。仅此一项就可以解决您的问题。但是对于 return 和 class 的方法也是有意义的,因为它已被修改。这只是一个很好的阶梯
如果较小的方法与主方法在同一个 class 中,则不要将它们作为参数传递,这些方法将使用 class 的字段。这是非线程安全的,但是你的 class 已经是非线程安全的了。
class MyClass
{
int numberOfBlocks = 0;
int currentBlock = 0;
int currentTime = 0;
ArrayList<Request> queue = new ArrayList<Request>();
void myMainMethod() {
if(queue.size != 0) {
updateStatus();
}
if(something else happens) {
removeFinished();
}
}
private void updateStatus() {
if (queue.get(0).getBlock() > currentBlock)
currentBlock++;
else
currentBlock--;
numberOfBlocks++;
}
private void removeFinished() {
if (queue.get(0).getBlock() == currentBlock) {
queue.remove(0);
}
}