全局变量让我为空

时间:2012-03-02 06:28:09

标签: java android

我想在我的项目中使用Global变量,所以我只需要一个可以轻松设置并获取任何变量数据的类。

喜欢这个::

public class Glob_variable {


        String Path = new String();

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

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


    }

但是当我初始化它时,我得到一个null异常。 我通过创建Glob_variable类的对象来初始化它。

喜欢::

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

当我在第二个活动中调用时,我在跟踪时得到了null变量。 我打电话给:

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

那么你能告诉我我犯了哪个错误吗?

3 个答案:

答案 0 :(得分:2)

Glob_variable g = new Glob_variable();将创建新实例,使用static变量或应用singletone

<强> Singletone:

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

答案 1 :(得分:1)

我认为这是因为你从另一个Glob_variable类的实例调用了get方法。

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;
        }
        /**********************************************/

    }

答案 2 :(得分:1)

嗯,这里有很多答案,但我想像你一样,你也来自VB(或类似的东西)世界(我看到你的所有变量都用大写字母大写!)。

您必须明白,与VB不同,Java中没有“REAL”全局访问。当您使用'new'运算符时,将创建该类的新实例,并根据构造函数契约重新分配所有值。因此,要删除用于存储全局值的变量的实例化。

第二个选项是静态变量,但我发现你在使用它们时遇到了困难。在这里,我有一种强烈的感觉,有时你在为它们赋值之前使用静态变量。你必须确保在你的getter之前总是调用你的setter。您甚至可以通过自定义异常,如下面的

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;
    }
    /**********************************************/


}

使用Glob_variable.getPath()等访问变量。尝试遵循Java的命名约定,从长远来看,它将对您有所帮助:))

我发现以下链接对于理解单词http://www.javacoffeebreak.com/articles/designpatterns/index.html非常有用,请阅读它。

全局值是常量还是必须在运行时设置?如果它们是常量,那么我会说你创建一个带有final变量的接口并在你的代码中使用它们。