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在整个项目中使我的变量可访问?提前致谢.
编写一个所谓的工厂类,它可以一步构建您的整个项目。
例子:
// 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 的子类)。
编辑
另一个优点是您可以单独测试您的类,因为您可以轻松地模拟参数(例如,通过传入参数的子类)。