我在Java中遇到了一个微不足道但却很烦人的问题。假设我们有以下类和方法:
class A{
void doSth(int[] array){
int index1, index2, index3;
int value1, value2, value3;
if(array[index1] > 10){
//Long code modifies value1, value2, value3
}
if(array[index3] > 100){
//Same long code modifies value1, value2, value3
}
if(array[index2] > 20){
//Same long code modifies value1, value2, value3
}
}
无视这是想要实现的目标,我想以某种方式使这种冗余消失。通常,我会将值传递给hlper方法,但我不能,因为块正在修改局部变量。知道如何简化这个吗?
答案 0 :(得分:9)
听起来你value1
,value2
和value3
可能有一些含义的组合。因此,将它们封装到一个单独的类中,此时您可以调用一个方法来修改现有实例或返回该类的新实例。无论哪种方式,使用单个局部变量你都可以。
答案 1 :(得分:0)
您可以重构代码以突破传递所需内容的方法,但是您需要引入一些私有字段。
private int value1,value2,value3;
private void doIt(int index, int threshold) {
if (array[index] <= threshold)
return;
... //Same long code modifies value1, value2, value3
}
然后将您的主要代码替换为:
void doSth(int[] array, int index1, int index2, int index3) {
doIt(index1, 10);
doIt(index3, 100);
doIt(index2, 20);
}
你已经完成了。
答案 2 :(得分:0)
如果if语句中的代码完全相同,为什么不这样做呢:
class A{
void doSth(int[] array){
int value1, value2, value3;
int index[][] = {
{val1, 10},
{val2, 100},
{val3, 20}
};
// ...
for(int i = 0; i < index.length; i++){
if(array[index[i][0]] > index[i][1]){
// ... Long code modifies value1, value2, value3
}
}
}
}