在Java中控制类加载顺序

时间:2009-04-12 09:28:40

标签: java static classloader

我创建了一个包含一堆属性值的类。 为了初始化该类,我必须调用一些静态方法“configure()”,它从XML文件配置它。

该类应该用于存储一些数据,以便我可以写

PropClass.GetMyProperty();

我从main中的静态块调用configure(),所以我可以在任何地方使用它

但是

如果我将其他类的静态常量成员设置为我的“PropClass”中的值,则为null,

class SomeClass {

   static int myProp = PropClass.GetMyProperty();

}

这可能是因为在调用configure之前评估了该表达式。 我该如何解决这个问题?

如何强制执行对configure()的调用? 谢谢

4 个答案:

答案 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中,您已经获得了所需的一切:

  • 用于定义具有可配置属性的bean的XML格式,无需编写用于读取XML和自己初始化bean的逻辑。
  • Beans在您需要时进行初始化(前提是您以正确的方式访问它们)。最好的方法是将bean注入调用者。

不要发明轮子...... Spring是Java中最常用的框架之一。恕我直言,没有大型Java应用程序应该编码。