2011-05-31 195 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