2011-05-31 84 views
1

这个问题是一个常见问题,我试图看看一些线程为Is Java "pass-by-reference" or "pass-by-value"?How to change an attribute of a public variable from outside the class 但在我的情况下,我需要修改一个布尔变量,具有单例实例。如何从方法更改变量

到目前为止,我有一个类和一个方法,它改变了类的布尔参数。但我想在经理中分开这个方法。该计划是这样的:

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. 
    } 
} 

谢谢, 大卫。

+1

** Java是通过对象共享调用** - 在Java中,这通常被称为“Pass By Value [Of The Reference]”。将问题*转换为* Java。这不是Java方式:) – 2011-05-31 08:12:27

回答

1

如果我理解你的要求 - 这可以解决你的问题:

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

将b定义为静态变量。

然后调用Test.b = value

+0

无法声明为静态的,然后任何类都可以更改值,我希望每个类都有自己的副本。 – Dayerman 2011-05-31 08:15:39

0

也许:

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

应该帮助?无需实例即可调用静态字段和方法(即Test.setB();)。

+0

但是,然后所有的变量共享该变量,我不想这样。 – Dayerman 2011-05-31 08:16:56

+0

然后,您需要创建一个'Test'类的实例,并将其作为参数传递给'doSomething'。 – Sorrow 2011-05-31 08:20:58

0

我认为你的问题不是很清楚,你的示例代码真的很糟糕。你的意思是这样吗?

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

感谢代码提示。经理应该是单身人士 – Dayerman 2011-05-31 08:52:47

+0

所以你想在每个实例创建时让经理初始化类吗?如果是这样,您必须将该实例传递给经理。但考虑工厂模式,而不是相互依赖的代码。 – user658991 2011-05-31 08:58:17

1
  1. 您可以提取public void setb(){}成一个接口(姑且称之为BSettable),使Test实施BSettable,并通过BSettable类型的参数为doSomething

  2. 或者,你可以把bAtomicBoolean,使doSomething接受(参考到)一个AtomicBoolean