Search code examples
javastaticinitializationfinalstatic-classes

How can I initialize final static variable in a static class?


So I'm using Processing to draw a map from a data file. I want to stock some information of the first line inside a class. In processing this class is an inner class of PApplet, so it has to be a static class (Otherwise i get an error: static fieldscan only be declared in static or top level type).

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]); 
    }
}

When I run this code, I get an error, because I can't use the loadStrings() function (which is non-static).

So what I want is to have static final variables that I can initialize from the "population.tsv" file. What are your ideas/advices?


Solution

  • 1) Make the method static, and you will be fine -- static code must be in order must be compiled in order. Put the loadStrings function before the static code block.

    Please note : However - you might be better off simply creating a single, static , "init" method, which is called in your static code block . This will be nameable and unit-testable, unlike your current implementation.

    2) By the way : your float syntax is off, and must to be casted properly.

      int i = (int) 1.4f; 
    

    3) To initialize the static variables you can do the following :

    • Declare a static init() method, which reads the file and initializes the static variables.
    • Create a separate FileReader object in a separate class, or a static inner class, which can be invoked to read in variables , and invoke it FROM your static code block.
    • (bad idea) Put the file reading logic inside of your big static code block . this will be very ugly however.