Как я могу инициализировать окончательную статическую переменную в статическом классе? - PullRequest
2 голосов
/ 02 декабря 2011

Так что я использую 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". Каковы ваши идеи / советы?

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

Вы не можете запустить метод класса loadString в статическом контексте.Чтобы запустить его из этого контекста, вам также необходимо сделать статический метод loadString (или переместить его вне статического контекста).

2 голосов
/ 02 декабря 2011

1) Сделайте метод статичным, и у вас все будет хорошо - статический код должен быть в порядке, должен быть скомпилирован в порядке.Поместите функцию loadStrings перед блоком статического кода.

Обратите внимание: однако - вам может быть лучше просто создать один статический метод init, который вызывается в вашем статическом кодовом блоке.Это будет именуемое и модульное тестирование, в отличие от вашей текущей реализации.

2) Кстати, ваш синтаксис с плавающей точкой выключен и должен быть правильно приведен.

  int i = (int) 1.4f; 

3) Для инициализации статических переменных вы можете сделать следующее:

  • Объявите статический метод init (), который читает файл и инициализирует статические переменные.
  • Создайте отдельный объект FileReader в отдельном классе или статический внутренний класс, который можно вызыватьчитать в переменных и вызывать его из вашего статического блока кода.
  • (плохая идея) Поместите логику чтения файлов в ваш большой статический кодовый блок.это будет очень некрасиво однако.
0 голосов
/ 02 декабря 2011

Я размышляю:

String [] lines = (новый PApplet ()). loadStrings ( "population.tsv");

...