2012-06-10 4 views
3

У меня есть тривиальная, но раздражающая проблема в Java. Предположим, что мы имеем следующий класс и метод: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

@Wojtek Может читать больше, чем в первом предложении вопроса? Весь вопрос в том, как он может преодолеть проблемы именно с таким подходом. И действительно в java нет хороших ответов на это (передать класс/массив элементов вокруг, вернуть класс/объект и переназначить - оба уродливые) – Voo

+0

Как вы используете значение value1-value2-value3 позже? – dbf

+0

Почему бы и нет? if (array [index1]> 10 || array [index3]> 100 || array [index2]> 20)? Имеет ли смысл последовательность изменений? – Justin

ответ

9

Это звучит, как вы value1, value2 и value3, вероятно, имеют какое-то значение в сочетании. Поэтому инкапсулируйте их в отдельный класс, и в этот момент вы можете вызвать метод, который либо изменяет существующий экземпляр, либо возвращает новый экземпляр этого класса. В любом случае, с одной локальной переменной вы будете в порядке.

+0

Ну, эти значения являются локальными мерами, очень специфичными только для одного конкретного подхода в рамках этого одного класса ... Я знаю, что могу инкапсулировать это в класс, но это похоже на перегиб, поскольку эти значения могут измениться в следующем классе , Мой вопрос более широк - можем ли мы убежать от Objecting в этом случае? – Bober02

+0

@ Bober02: Не легко, нет. Я не понимаю, почему вы захотите - это звучит так, как будто они * являются связанными значениями, поэтому их инкапсуляция имеет смысл. Вы можете всегда превращать их в частный вложенный (возможно, статический) класс, чтобы уменьшить область действия. –

+0

Хммм ... Это действительно здорово. Частное статическое - это то, что я не рассматривал. Благодаря! – Bober02

0

Вы можете реорганизовать свой код, чтобы разразиться метод, в котором вы передаете все, что вам нужно, но вам необходимо ввести некоторые частные поля .:

частное ИНТ значение1, значение2, 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); 
} 

И вы сделали.

+0

значения НЕ являются полями класса! – Bober02

+0

@ Bober02 Просто заметил, что - я отредактировал, чтобы сделать их такими. Я все еще думаю, что это случай для рефакторинга – Bohemian

0

Если коды в случае утверждения все точно так же, почему вы не просто делать это так:

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 
     } 
     } 
    } 
} 
Смежные вопросы