Как я могу инициализировать окончательную статическую переменную в статическом классе?

StackOverflow https://stackoverflow.com/questions/8349966

Вопрос

Поэтому я использую обработку, чтобы нарисовать карту из файла данных. Я хочу подать некоторую информацию о первой линии внутри класса. При обработке этот класс является внутренним классом 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 () (которая не статична).

Итак, я хочу иметь статические окончательные переменные, которые я могу инициализировать из файла «popul.tsv». Какие у вас идеи/советы?

Это было полезно?

Решение

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

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

2) Кстати: ваш синтаксис поплавки выключен и должен быть чокнут должным образом.

  int i = (int) 1.4f; 

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

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

Другие советы

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

Я спекулирую:

String [] lines = (new Papplet ()). LoadStrings ("Popult.tsv");

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top