2014-12-27 4 views
3

Допустим, у меня есть открытый класс со статическими методами, один из них, например:Постоянное изменение переменной в статическом методе

public static void test(boolean b){ 
    b = !b; 
} 

Скажем, это имя класса Test. Из другого класса, где у меня есть переменный булев а = ложь, я называю

Test.test(a); 

Как я могу сделать это изменить стационарно, а не просто изменить его в том, что статические методах рамка?

+2

Можете ли вы объяснить, почему вы пытаетесь это сделать, поскольку, вероятно, есть лучший способ решить вашу проблему. –

+2

Я знаю, как обойти это, я просто не знал, возможно ли это, так что мне хотелось спросить :) – Greyshack

+0

Тогда ответ не делает этого, сделайте что-нибудь еще. Изменение кода «на лету» - это не простой процесс. Вы должны подумать об изменении полей. –

ответ

0

Звуки для меня, как вы ищете MutableBoolean, самым простым из которых является AtomicBoolean.

private void changeIt(AtomicBoolean b) { 
    b.set(!b.get()); 
} 

public void test() { 
    AtomicBoolean b = new AtomicBoolean(false); 
    changeIt(b); 
    System.out.println(b); 
} 
2

Единственный способ сделать изменения постоянными, чтобы дать метод имеет возвращаемое значение и присвоить его переменной:

public static boolean test(boolean b){ 
    return !b; 
} 

a = Test.test(a); 
+0

Вы уверены, что это единственный способ? Как я могу сразу изменить две переменные? – Greyshack

+1

@ Greyshack: У вас нет. Если вам нужно изменить несколько переменных, вы должны почти наверняка инкапсулировать комбинацию этих переменных в классе. –

+1

@ Greyshack Изменение двух переменных сразу невозможно.Если переменная является ссылкой на изменяемый объект, вы можете изменить свойства объекта, но вы не можете изменить саму ссылку. – Eran

0

Используйте статическое поле:

public static boolean flag; 

public static void test(boolean b){ 
    flag = !b; 
} 

Тогда:

boolean a = true; 
Test.test(a); 

System.out.println(Test.flag); // false 
0

в вашем классе Test вы можете определить булевскую переменную как статическая

public static boolean a; 

и за ее пределами изменения класса или доступ к нему с помощью Test.a=false; или a=Test.a

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

public class HideStatic {  
public static void main(String...args){ 
    BaseA base = new ChildB(); 
    base.someMethod();   
} 
} 

class BaseA {   
    public static void someMethod(){ 
     System.out.println("Parent method"); 
    } 
} 

class ChildB extends BaseA{ 
    public void someMethod(){ 
     System.out.println("Child method"); 
    } 
} 
+0

Хорошо, но в этом случае у меня есть переменная в классе со статическими методами, и что, если я хочу иметь разные переменные в разных классах и использовать этот метод? – Greyshack

+0

, а как насчет того, чтобы скрыть их, используя новый класс, который наследует статический класс держателя? (Я отредактировал ответ) – jfun

0

You может передать экземпляр методу и использовать сеттеры для одновременного изменения нескольких переменных.

public static void updateData(MyClass instance) { 
    instance.setX(1); 
    instance.setY(2); 
} 
0

Я думаю, что вы запрашиваете call by reference. Вы можете получить это на Java с помощью массивов:

public static void test(boolean[] b){ 
b[0] = !b[0]; 
} 

boolean[] param = new boolean[] {a}; 
test(param); 
a=param[0]; 
//a changed 

Это работает, но это уродливо. Если вам нужно вернуть более одного значения, посмотрите на структуры the Pair or Tuple.

+0

Хорошо, это будет иметь смысл, в c, C++ массивы также указывают на первый элемент. Хорошо знать :) – Greyshack

Смежные вопросы