2012-03-02 90 views
1

我想在我的項目中使用全局變量,所以我只需要一個可以輕鬆設置並獲取任何變量數據的類。全局變量讓我空

這樣的:

public class Glob_variable { 


     String Path = new String(); 

     /**********************************************/ 
     public void setPath(String Path) { 
      this.Path = Path; 
     } 

     public String getPath() { 
      return Path; 
     } 
     /**********************************************/ 


    } 

但是,當我初始化它,我得到一個空例外。 我已經通過創建一個Glob_variable類的對象來初始化它。

像::

Glob_variable g = new Glob_variable(); 
     g.setPath("asdasd"); 

,當我在第二個活動叫我空變量時,我跟蹤。 我已經叫這樣的:

Glob_variable g = new Glob_variable(); 
g.getPath(); 

所以,你可以告訴我,在這一點上,我犯了一個錯誤?

回答

1

我想這是因爲你的呼籲從另一個你Glob_variable類的實例獲取方法。

Glob_variable g = new Glob_variable(); 
     g.setPath("asdasd"); 
     String path = g.getPath(); 

上面的代碼是有效的。但是如果在類中使用上面的代碼之後,在另一個類/活動中使用下面的代碼,那麼它是無效的,因爲您在另一個類/活動中創建了另一個Glob_variable實例。

Glob_variable g = new Glob_variable(); 
String path = g.getPath(); 

嘗試在你的代碼以下單噸拍打,

public class Glob_variable 
{ 
    private Glob_variable GVariableClass; 
    private static String Path; 
    private Glob_variable() 
    { 
      GVariableClass = this; 
    } 

    public static Glob_variable getInstance() 
    { 
      if (GVariableClass == null) 
      { 
       GVariableClass = new Glob_variable(); 
      } 
      return GVariableClass; 
    } 

     /**********************************************/ 
     public void setPath(String Path) { 
      this.Path = Path; 
     } 

     public String getPath() { 
      return Path; 
     } 
     /**********************************************/ 

    } 
+0

可能是因爲我在第二個activity中使用'Glob_variable g = new Glob_variable(); g.getPath();'所以可能是它一次創建新的實例....不是嗎? – 2012-03-02 08:01:01

+0

是的,正好.... – Android 2012-03-02 08:06:12

+0

是的,你是對的....謝謝...... +1 – 2012-03-02 09:00:52

2

Glob_variable g = new Glob_variable();將創建新實例,使用static變量或應用singletone

Singletone:

Glob_variable.getInstance().setPath("abc"); 
String path = Glob_variable.getInstance().getPath("); 
+0

我以前使用過靜態變量,但我沒有成功一些時間 – 2012-03-02 06:34:37

+0

它總是相同,如果它是靜態的,使用單身如果靜態不是首選 – 2012-03-02 06:36:30

+0

靜態變量應該工作。如果不成功,可能是由於其他錯誤。 – 2012-03-02 07:03:32

1

好,有很多答案在這裏,但我覺得你像我一樣也是來自VB(或者類似的東西)世界(我看到你的所有變量都是用第一個字母大寫!)。

您必須明白,與VB不同,Java中沒有「REAL」全局訪問。當您使用'new'運算符時,會創建該類的新實例,並根據構造函數合約重新分配所有值。因此,請暫時關閉用於存儲全局值的變量實例。

第二種選擇是靜態變量,但我看到你在使用它們時也有困難。在這裏,我有一種強烈的感覺,有時你使用你的靜態變量,然後給它們賦值。你必須確保你的引導者總是在你的獲得者之前被調用。你甚至可以通過像使用Glob_variable.getPath(以下

public class Glob_variable { 


    static String Path = ""; 

    /**********************************************/ 
    public static void setPath(String Path) { 
     Glob_variable.Path = Path; 
    } 

    public static String getPath() throws Exception{ 
     if("".equals(Path)){ 
      throw new Exception("Variable no inited yet") 
     } 
     return Path; 
    } 
    /**********************************************/ 


} 

訪問您的變量)自定義異常等嘗試以下命名爲Java約定爲好,它會幫助你從長遠來看:)

我發現下面的鏈接對理解singltons非常有用http://www.javacoffeebreak.com/articles/designpatterns/index.html請閱讀。

是否全局值不變或必須在運行時設置?如果它們是恆定的,那麼我會說你創建一個帶有最終變量的接口並在代碼中使用它們。