Java 正在初始化静态类成员-请进行一些澄清

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

我是一个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方法确定的,其他para是通过calcOtherPara方法找到的。在doGuidedTask的单个实现之后,可以调用saveKeyPara将它们保存到文件中,并可以读入以供后续运行应用程序

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


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

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

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

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

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

static {
   staticMethodThatInitializesStaticMembers ();
}

在对象模型设计完成之前,您似乎正在尝试实现某些东西。您可能有以下对象:
机器人
(执行任务的对象)<代码>任务(要执行的事情)
TaskStrategy
(如何执行任务..您所说的具有引导和计算参数的项目)。您需要确定任务策略是按任务还是按机器人,并在相应的类中包含对
TaskStrategy
对象的引用。您可能需要一个
TaskStrategyLibrary
,它处理从初始创建到后续学习周期的任务策略。使用factory类,您可以为机器人获得适当的任务策略(
strategy=TaskStrategyLibrary.getStrategy(robot,task)
;并让TaskStrategy类处理基本策略的“参数”更改和更新。

我认为calcOtherPara和saveKeyPara也可以定义为静态的,就像(如果我理解了您的程序一样)他们将只访问静态变量。因此,您可以在静态初始化内部调用。这是我的想法。只是要明确:在这种情况下,静态变量在创建实例和启动doTask之前不会初始化-我认为这是确定的?正确的。既然您说您是新手,这是一个可接受的解决方案。一旦您将了解更多有关面向对象和设计模式的信息,您可以开始考虑使用工厂或构建器模式拆分内容。祝您好运。
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
    }
}