2011-11-22 26 views
6

我有一個java應用程序在基類中創建兩個靜態對象,這些對象需要引用程序中的所有類。在整個應用程序中引用一個類中創建的靜態對象

public class Baseclass{ 
    public static ClassA A = new ClassA(); 
    public static ClassB B = new Classb(); 
    ... 
    ... 
    ... 
} 

這些對象在其他類中被引用爲本地私有變量。

public class ClassA{ 
    private ClassB b = Baseclass.B; 

但是,這兩個對象需要相互起作用,如果我之前創建的其他對象的一個​​新實例被創建,在「上」班局部變量被設置爲null。 Java中是否有任何概念將實際對象(如指針)作爲變量引用到對象而不是複製對象?

+4

談不好的設計.. – mre

+0

(ObPlead:請,請不要使用mutable statics(以前稱爲全局變量),這包括使用singleton反模式) –

回答

6

我認爲你正在尋找的答案是「單身模式」。這是您創建一個類的一個實例在其他地方使用的地方。這是一個good link to read。這裏有一些java示例的wikipedia page on it

所以您的代碼會是這個樣子:

public class A { 
    private final static A instance = new A(); 

    /* private constructor forces you to use the getInstance() method below */ 
    private A() {} 

    public static A getInstance() { 
     return instance; 
    } 
} 

那麼無論你想,你會做這樣的事情一個實例:

public class B { 
    private final A classA = ClassA.getInstance(); 
    ... 
} 

沒有理由A可能也不具有B的實例,並在其自己的方法中調用B的方法。你無法用這個交叉依賴關係調用構造函數中其他方法的任何一個。

一般來說,順便說一句,這些模式應該謹慎使用。更好的方法是通過依賴注入來代替全局引用。交叉注射是可能的,但同樣應該謹慎使用。更好的解決方案是重構類以獲得線性依賴關係。

Java中是否有任何概念將引用作爲變量的對象的實際對象(如指針)而不是製作對象的副本?

Java是傳值但任何對象的值是參照對象(類似於在C指針儘管它們不一個存儲器地址)。因此,如果您有A的實例並將其分配給另一個字段,則該字段將具有相同的值,並且將引用同一個A實例。

// instantiate a new instance of A 
A a1 = new A(); 
// assign the reference to A to another variable 
a2 = a1; 
// they are equivalent and both reference the same object 
if (a1 == a2) ... 
1

是否有Java中的任何概念,將實際的對象(如指針)作爲變量引用到對象而不是複製對象?

事實上,Java有只有引用。一個變量不能包含一個對象,所以不用擔心。

此外,而不是做

private ClassB b = Baseclass.B; 

我建議你考慮做靜態導入:

import static some.package.Baseclass.*; 
+0

我編輯了原文,使'private classB'語句在語法上正確。無論如何,只要我的編輯被接受了...... –

1

當您在Java中的引用您在實際進行引用的副本。在您的示例中,您沒有複製Baseclass.B。您正在複製參考Baseclass.B

在您提供的示例代碼中,b將會爲空,直到定義了Baseclass.B。如果您需要在b上進行操作,則不能在ClassA的聲明中進行操作。您需要在創建對象a之後調用的方法執行此操作。

0

這是一個單身人士的經典應用程序。

對於每一個:

  • 使構造私有。
  • 添加該類自己類型的私有靜態成員來保存 單身人士。
  • 添加一個「getThe()」方法,該方法初始化上述成員,如果它尚未設置。

請參閱wikipedia:Singleton pattern

通過對其構造一個getThe()來構造構造函數B。

另外,請不要在Baseclass;而是使用公共的getter方法。不要保留一個單獨的B變量;相反,請問一個單身人士。

0

有沒有在Java中,將參考實際的對象 (如指針)的對象作爲一個變量,而不是製作一份拷貝的對象 的任何概念?

當你這樣做:

private ClassB b = Baseclass.B; 

真的是你在同一個對象龐廷一個是因爲「B」變量命名爲參考變。

關於你的問題,我的recomendation是做這樣的事情:

首先encapsule參考:

public class ClassA{ 
    private ClassB b; 

    public void setB(ClassB b) { 
     this.b = b; 
    } 

    public ClassB getB(ClassB b) { 
     return this.b; 
    } 

} 

二使用一個靜態塊初始化的變量:

public class Baseclass{ 
    public static ClassA A = new ClassA(); 
    public static ClassB B = new Classb(); 
    static { 
     A.setB(B); 
     B.setA(A); 
    } 
} 
相關問題