2013-11-14 58 views
-3

我在想如果有人能告訴我如何從一個類中獲取實例。
這裏是我的代碼,到目前爲止,我看到這從另一個職位,但我不斷收到一個NullPointerException獲取某個類的實例

這是我的主類。

public class Main { 

private String name; 
private static Main instance; 
public static void main(String[] args) { 
    Test.sayMyName(); 
} 

public Main(){ 
    instance = this; 
} 

public static Main getInstance(){ 
    return instance; 
} 

public void setName(String name){ 
    this.name = name; 
} 

public String getName(){ 
    return this.name; 
} 
} 

這是我的其他類。

public class Test { 
public static void sayMyName(){ 
    Main.getInstance().setName("Hi im John"); 
    System.out.println(Main.getInstance().getName()); 
} 
} 

我得到了錯誤的"Main.getInstance().setName("Hi im John");"

+3

你沒有在任何地方調用'new Main()'... – Darkhogg

+2

想'new' :-) – Nishant

+0

你是否試圖實現[Singleton Pattern](http://en.wikipedia.org/wiki/) Singleton_Pattern)?如果沒有,一個正常的構造函數對我來說似乎很好。 –

回答

3

更改以下懶初始化

public Main(){ 
    //instance = this; 
} 

public static Main getInstance(){ 
    if(instance == null){ 
      instance = new Main(); 

    } 
    return instance; 
} 
+0

謝謝多做!有效! – user2992247

+0

@ user2992247你可以看看單身模式 –

0

靜態成員,例如,僅在構造函數類主要設置。代碼中沒有任何地方在調用該構造函數。

+0

謝謝你做得太多!有效! – user2992247

0

試試這個:

public class Main { 

    private String name; 
    private static Main instance; 
    public static void main(String[] args) { 
     Test.sayMyName(); 
    } 

    public Main(){ 

    } 

    public static Main getInstance(){ 
if (instance == null) { 
    instance = new Main(); 
} ; 
return instance; 
    } 

    public void setName(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
return this.name; 
    } 
    } 
+0

非常感謝你! – user2992247

2

注意,只設置了構造函數,這是從來沒有所謂的內部實例的值。 Java有一個很好的技巧,它允許你爲每個類運行一段代碼(靜態)。還有其他方法可以做到這一點(閱讀this),但這與我的觀點相同。

public class Main{ 
    // member variables 
    ... 
    // functions like Main(), getInstance(), etc here 
    ... 
    // static initialization 
    static{ 
     Main.instance = new Main(); 
    } 
} 

另外,如果你想強制執行的Main可以使用的是一個實例,可以使構造private用戶。這樣他們只能訪問getInstance

+0

對於私人構造函數的建議+1。 –

+0

哦,我看到這麼像'私人主(){}'? – user2992247

+0

是的。 'private Main(){}'表示除Main之外的任何類都不能創建它。如果你想要單獨的子類,你可以將它設置爲'protected'。但這很奇怪,你應該避免它。 – rangu