Как изменить переменную из метода - PullRequest
1 голос
/ 31 мая 2011

Этот вопрос является распространенной проблемой, и я пытался рассматривать какой-то поток как Является ли Java "передачей по ссылке" или "передачей по значению"? или Какизменить атрибут публичной переменной вне класса , но в моем случае мне нужно изменить логическую переменную с экземпляром Singleton.

Пока у меня есть класс и метод, который изменяетбулевский параметр класса.Но я бы хотел отделить этот метод от менеджера.Схема примерно такая:

public class Test{
    private boolean b;
    public String getb(){}
    public void setb(){}
    String test = ClassSingleton.getInstance().doSomething();
}

public class ClassSingleton{
    public String doSomething(){
        //here I need to change the value of 'b'
        //but it can be called from anyclass so I cant use the set method.
    }
}

Спасибо, Дэвид.

Ответы [ 5 ]

1 голос
/ 31 мая 2011
  1. Вы можете извлечь public void setb(){} в интерфейс (назовем его BSettable), заставить Test реализовать BSettable и передать аргумент типа BSettable в doSomething.

  2. В качестве альтернативы, вы можете сделать b в AtomicBoolean и заставить doSomething принять (ссылку на) на AtomicBoolean.

1 голос
/ 31 мая 2011

Если я понимаю ваше требование - это может решить вашу проблему:

public interface IUpdatable
{
    public void setB(boolean newValue);
}

public class Test implements IUpdatable
{
    private boolean b;
    public String getb(){}
    public void setB(boolean newValue) {this.b = newValue;}
}

public class ClassSingleton
{
    public String doSomething(IUpdatable updatable)
    {
        updatable.setB(true);
        ...
    }
}

Таким образом, Singleton не нужно знать ваш класс Test - он просто знает интерфейс IUpdatable, которыйподдерживает установку значения B.Каждый класс, которому необходимо установить свое поле B, может реализовать интерфейс, а Singleton может обновить его и не обращать внимания на его реализацию.

0 голосов
/ 31 мая 2011

Я думаю, что ваш вопрос не очень понятен, и ваш пример кода действительно плохо сделан. Вы на самом деле имеете в виду что-то вроде этого?

public class Test{
    private boolean b;
    public boolean getb(){return b;}
    public void setb(boolean b){this.b = b;}
    String test = ClassSingleton.getInstance().doSomething(this);
}

public class ClassSingleton{
    private static ClassSingleton __t__ = new ClassSingleton();
    private ClassSingleton() {} 
    public String doSomething(Test t){
        t.setb(true);
        return null;
    }

    public static ClassSingleton getInstance(){
        return __t__;
    }
}

Вы имеете в виду, что ваш менеджер - одиночка? или ваш тестовый класс должен быть синглтон? Пожалуйста, будьте более конкретны

0 голосов
/ 31 мая 2011

Возможно:

public class Test {
   private static boolean b;
   public static String getB() {}
   public static void setB() {}
}

должно помочь?Статические поля и методы могут быть вызваны без экземпляра (например, Test.setB();).

0 голосов
/ 31 мая 2011

Определить b как статическая переменная.

Тогда звоните Test.b = value

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...