如何在静态类中初始化final static变量?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在静态类中初始化final static变量?相关的知识,希望对你有一定的参考价值。

所以我正在使用Processing从数据文件中绘制地图。我想在类中存储第一行的一些信息。在处理这个类时是一个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对象,可以调用它来读取变量,并从静态代码块中调用它。
  • (坏主意)将文件读取逻辑放在大型静态​​代码块中。然而,这将是非常丑陋的。
另一答案

你不能在静态上下文中运行类方法loadString。为了从这个上下文中运行它,你需要使你的loadString方法也是静态的(或者将它移到静态上下文之外)。

另一答案

我猜测:

String [] lines =(new PApplet())。 loadStrings( “population.tsv”);

以上是关于如何在静态类中初始化final static变量?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中static 和final的区别是啥

16 final static super this

java-为什么非静态内部类中不能有static修饰的属性,但却可以有final常量?

final,static静态和非静态,初始化和代码块的区别父类和子类中都有static变量时的初始化顺序重写equals() instanceof强制转换

java中的常量,是否必须定义为static final的呢

什么是static?什么是final?