初始化静态类成员 - 请澄清一些

时间:2014-08-01 15:35:33

标签: java static initialization

我是java的新手,我希望对静态类变量何时需要初始化做一些澄清。插入我的代码有点多,所以让我把它分解为基本元素。我有一个执行特定任务的对象。此任务需要设置许多参数。理想情况下,这些参数是静态的,因为类的任何实例都将使用相同的参数。该对象基本上是一个自动执行任务的机器人。必须“训练”机器人的第一个实例来完成任务(由用户输入引导)。在这个“训练”中,它学习了一些关键参数,并从中计算出所需的其他参数(通过私有方法)。然后将关键参数保存到文件中以供其他实例使用,并随后运行程序(即仅进行一次训练)。

代码的结构类似于......

public class Master {
   static int[] keyPara;
   static int[] otherPara;

   public Master() {
      /* some defining stuff */
   }

   void doGuidedTask() {
       /* some stuff that calls private methods, etc */
   }

   void doTask() {
      /* some stuff that calls private methods etc */
   }

   void calcOtherPara() {
      /* method to calculate other parameters given key parameters */
   }

   void saveKeyPara() {
      /* method to save key parameters to File */
   }
}

问题是在代码中初始化这些参数的正确/最佳方法是什么? keyPara是通过实现doGuidedTask方法确定的,而otherPara是使用calcOtherPara方法找到的。在doGuidedTask的单个实现之后,可以调用saveKeyPara将它们保存到文件中,并且可以读入以便后续运行应用程序。

我可以使用静态初始化块:测试文件是否存在,如果是,则加载关键参数。不确定是否允许这样做是因为它需要使用calcOtherPara方法来确定其他参数,即在初始化中使用类方法。即使是keyPara中的读取也最好作为一种方法实现(着眼于未来的代码开发)。如果我在构造函数中使用相同的方法,就会出现同样的问题 - 我在论坛的其他地方读到,建议不要使用构造函数中的方法(不确定我理解为什么)。

我阅读了有关静态变量的教程,但我确实不清楚它们何时需要定义以及在这种情况下我应该做什么。任何建议都将不胜感激。

4 个答案:

答案 0 :(得分:1)

您应该使用静态方法初始化静态变量。

您可以从类的静态初始值设定项中调用此静态方法。

static {
   staticMethodThatInitializesStaticMembers ();
}

答案 1 :(得分:1)

public class Master {
    static boolean initialised=false;
    static int[] keyPara;
    static int[] otherPara;

    public void doTask() {
        if (!initialised)
        {
            boolean filefound=false;
            // put here code to check if your saved file exists
            if(filefound)
            {
               loadkeyfile();
               calcOtherPara();
               initialised=true;
               doAutomatedTask();
            } else {
               doGuidedTask();
               saveKeyPara();
               calcOtherPara();
               initialised=true;
            }
        } else {
            doAutomatedTask();
        }
    } 
    private void doAutomatedTask() {
       // put your non-interactive version here
    }
}

答案 2 :(得分:0)

在对象模型设计完成之前,似乎正在尝试实现某些功能。您可能有以下对象:Robot(执行任务的事物); Task(要执行的事情); TaskStrategy(如何执行任务..您谈到的有引导和计算参数的项目)。您需要确定任务策略是由任务还是由机器人完成,并包括对相应类中的TaskStrategy对象的引用。您可能需要TaskStrategyLibrary来处理从初始创建到连续学习周期的任务策略。使用工厂类,您可以为机器人(strategy = TaskStrategyLibrary.getStrategy(Robot, Task))获取适当的任务策略;并让TaskStrategy类处理“参数”更改并更新基本策略。

答案 3 :(得分:-1)

对于这个例子,我建议在声明它们时初始化它们。例如,您可以这样做:

static int[] keyPara = {1, 2, 3, 4}; //put your array here
static int[] otherPara = {1, 2, 3, 4}; //put a different (or the same) array here