我创建了一个包含一堆属性值的类。 为了初始化该类,我必须调用一些静态方法“configure()”,它从XML文件配置它。
该类应该用于存储一些数据,以便我可以写
PropClass.GetMyProperty();
我从main中的静态块调用configure()
,所以我可以在任何地方使用它
但是
如果我将其他类的静态常量成员设置为我的“PropClass”中的值,则为null,
class SomeClass {
static int myProp = PropClass.GetMyProperty();
}
这可能是因为在调用configure之前评估了该表达式。 我该如何解决这个问题?
如何强制执行对configure()
的调用?
谢谢
答案 0 :(得分:5)
您可以使用静态代码块来执行此操作
static {
configure();
}
静态初始化程序块的语法?剩下的就是关键字static和一对匹配的花括号,其中包含在加载类时要执行的代码。 taken from here
答案 1 :(得分:2)
我会做以下事情:
class SomeClass
{
// assumes myProp is assigned once, otherwise don't make it final
private final static int myProp;
static
{
// this is better if you ever need to deal with exceeption handling,
// you cannot put try/catch around a field declaration
myProp = PropClass.GetMyProperty();
}
}
然后在PropClass中做同样的事情:
class PropClass
{
// again final if the field is assigned only once.
private static final int prop;
// this is the code that was inside configure.
static
{
myProp = 42;
}
public static int getMyProperty();
}
另外。如果可能的话,不要让一切都静止 - 至少使用singleton。
答案 2 :(得分:0)
您是否可以通过GetMyProperty()
方法检查是否已调用configure()
?这样你就可以调用GetMyProperty()
,而不必担心我们的对象是如何配置的。您的对象将为您照顾。
e.g。
public String getMyProperty() {
if (!configured) {
configure();
}
// normal GetMyProperty() behaviour follows
}
(如果你想要线程安全,你应该同步上面的内容)
答案 3 :(得分:0)
老兄,听起来你应该使用Spring Framework(或其他一些依赖注入框架)。在Spring中,您已经获得了所需的一切:
不要发明轮子...... Spring是Java中最常用的框架之一。恕我直言,没有大型Java应用程序应该编码。