java - 如何在静态类中初始化最终静态变量?

标签 java static initialization final static-classes

所以我正在使用处理从数据文件中绘制 map 。我想存储类中第一行的一些信息。在处理这个类时,它是PApplet的内部类,因此它必须是一个静态类(否则我会得到一个错误:静态字段只能在静态或顶级类型中声明)。

public static class PlacesInfo{
    static final int totalCount;
    static final float xMin;
    static final float yMin;
    static final float xMax;
    static final float yMax;
    static final int populationMax;
    static final int densityMax;


    //Set all static variables once
    static{
      String[] lines =  loadStrings("population.tsv");
      String info = lines[0].substring(2); //to delete some useless char
      String[] infoInit = split(info, ','); //to parse the data of the first line

      totalCount = int(infoInit[0]);
      xMin = float(infoInit[1]);
      xMax = float(infoInit[2]);
      yMin = float(infoInit[3]);
      yMax = float(infoInit[4]);
      populationMax = int(infoInit[6]);
      densityMax = int(infoInit[8]); 
    }
}

当我运行此代码时,出现错误,因为我无法使用 loadStrings() 函数(该函数是非静态的)。

所以我想要的是拥有可以从“population.tsv”文件初始化的静态最终变量。您有什么想法/建议?

最佳答案

1)将方法设为静态,这样就可以了——静态代码必须按顺序必须按顺序编译。将 loadStrings 函数放在静态代码块之前。

请注意:但是 - 您最好简单地创建一个静态的“init”方法,该方法在静态代码块中调用。与您当前的实现不同,这将是可命名和可单元测试的。

2)顺便说一句:你的浮点语法已关闭,必须正确转换。

  int i = (int) 1.4f; 

3)要初始化静态变量,您可以执行以下操作:

  • 声明一个静态 init() 方法,该方法读取文件并初始化静态变量。
  • 在单独的类或静态内部类中创建单独的 FileReader 对象,可以调用该对象来读取变量,并从静态代码块中调用它。
  • (坏主意)将文件读取逻辑放在大静态代码块中。但这会非常难看。

关于java - 如何在静态类中初始化最终静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8349966/

相关文章:

c++ - 带有 const 表达式的数组声明

java - 纯 Java G.722 实现

java - JBoss 6x 绝对 uri : http://java. sun.com/jsp/jSTL/core 无法在 web.xml 或使用此应用程序部署的 jar 文件中解析

Java静态/实例变量运行性能

c++ - C++ 中静态类函数最常见的用途是什么?

arrays - 有没有办法不必两次初始化数组?

java : non-static variable cannot be referenced from a static context Error

java - 使用 Collections.sort 对特定对象的 ArrayList 进行排序

java - 为什么我在调用此 Java 类时收到 "non static variable"错误?

mysql - 使用 Spring 的 "jdbc:initialize-database",如何使用存储过程运行脚本?