我需要在Java中使整个程序可以访问变量

alx*_*cyl 5 java global-variables

所以我的问题是这个.我有一个叫做的类Globals,它包含我在整个程序中需要的所有变量.它适用于字符串,整数和其他可以使用=操作的东西.例如:

public class Globals {
   public static int globalInteger = 23;
   public static String globalString = "Hello, dude.";
   public static UserProfile globalUserProfile;
}
Run Code Online (Sandbox Code Playgroud)

在项目的某个地方,我使用以下方法访问它们:

Globals.globalInteger += 17;

Globals.globalString = "Why, hello there!";

但是,我正在尝试创建一个我自己写的全局类(UserProfiles.class).这个类不使用该=操作,因此,总是null当我从其他地方访问它时,我得到了java.lang.nullPointerException.例如,如果我这样做(newProfile(String)是一个方法UserProfiles.class):

Globals.globalUserProfile.newProfile(profileName);

我得到java.lang.NullPointerException.如何UserProfile.class在整个项目中使我的变量可访问?提前致谢.

hel*_*hod 5

编写一个所谓的工厂类,它可以一步构建您的整个项目。

例子:

// a class which store configuration parameters - must be instanstiable!
public class Configuration {
   public Configuration() {
       // get configuration from Properties file, Resource Bundle etc.
   } 
}

public class A {
    private Configuration configuration;

    public A(Configuration configuration) {
        this.configuration = configuration;
    }
}

public class B {
    private Configuration configuration;
    private A a;

    public B(A a, Configuration configuration) {
        this.a = a;
        this.configuration = configuration;
    }
}

public class C {
    private Configuration configuration;
    private B b;

    public C(B b, Configuration configuration) {
        this.b = b;
        this.configuration = configuration;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里有 3 个类和一个配置类。它们都依赖于配置类,C依赖于B,B依赖于A。

如您所见,依赖项由构造函数参数反映,这很好,因为依赖项是显式的(这意味着,您现在无需查看源代码就需要哪些依赖项)。

但是,你如何构建这个对象图?好吧,通过使用工厂类(在这里,它甚至是一个静态工厂):

public class ApplicationFactory {
    // prevents instantiation
    private ApplicationFactory() {};

    public static C buildApplicationGraph() {
        // first, build the leaf objects (objects without other dependencies), here
        // Configuration
        Configuration configuration = new Configuration();

        // now, start injecting the dependencies needed
        // a only need a Configuration object
        A a = new A(configuration);

        // B needs a Configuration and an A object
        B b = new B(a, configuration);

        // we're done here        
        return new C(b, configuration);         
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,您正在自下而上构建对象图。所有依赖项都是显式的,并且您将构建过程与业务逻辑分开。

我们在这里所做的是构造函数依赖注入,即我们通过构造函数传入每个类需要的依赖项。为了创建所需的对象,我们编写了一个工厂。

最后,我们有轻量级类(这里没有构造工作)、显式依赖项(使用 Singleton 时没有)和最大的灵活性(工厂甚至可以返回 C 的子类)。

编辑

另一个优点是您可以单独测试您的类,因为您可以轻松地模拟参数(例如,通过传入参数的子类)。