Как обойти ограничение размера статического инициализатора в Java при инициализации большого количества констант

У меня есть класс, содержащий большое количество сгенерированных констант как таковых:

public class Constants extends SomeBaseClass {

  // init() is defined in some base class...
  public static final XXX KEY1 = init(...);
  public static final XXX KEY2 = init(...);
  public static final XXX KEY3 = init(...);

  // ...
  public static final XXX KEY2000 = init(...);
}

Когда количество сгенерированных констант очень велико, это приводит к тому, что статический инициализатор превышает верхний предел размеров методов Java (т. е. > 64 КБ), что приводит к ошибке компилятора. Одним из решений является создание нескольких «методов инициализации блоков» для блоков, которые могут гарантированно создавать менее 64 КБ байт-кода, чтобы они соответствовали методу:

public class Constants extends SomeBaseClass {

  public static XXX KEY1;
  public static XXX KEY2;
  public static XXX KEY3;

  // ...
  public static XXX KEY2000;

  static {
    initialise0001To1000();
    initialise1001To2000();
  }

  private static void initialise0001To1000() {
    KEY1 = init(...);
    KEY2 = init(...);
    KEY3 = init(...);
    // ...
  }

  private static void initialise1001To2000() {
    // ...
    KEY2000 = init(...);
  }
}

Недостатком этого является то, что я больше не могу объявлять константы как final, потому что теперь они больше не инициализируются непосредственно в статическом инициализаторе.

Мой вопрос: как я могу обойти это ограничение компилятора/JVM таким образом, чтобы я мог генерировать static final константы?

6
задан Lukas Eder 3 June 2012 в 11:26
поделиться