2013-03-26 12 views
0

Мне нужно заполнить встроенную функцию ~ 20k и константы из CHM-файла в список. Сначала я попытался их сериализовать, но десериализация занимает 1500 мс (слишком длинная для быстрого завершения кода, даже при первом попадании).Создание действительно большого Java-кода

Пробовал генерировать код с помощью StringTemplate, который генерирует действительный код. Но он не будет компилироваться, потому что метод initEnums() превысил предел размера 65536 ". (И мой Eclipse, умирает вскоре после)

Сформированный метод выглядит следующим образом:

public XModelField[] initEnums() { 
    return new XModelField[] { 
     new XModelField("aName", "aType", ...), 
     ... 
     // About 4'000 more entries 
    }; 
} 

Если этот предел ограничен только к исходному коду, я мог бы использовать другую библиотеку для создания файла класса непосредственно (возможно CodeModel). Я хотел бы сохранить код, если возможно, без повторной записи выходного генератора с нуля. Какие-либо предложения?

+0

как насчет десериализации заранее (и/или агрессивного кеширования)? –

+1

Это ограничение является ограничением файлов классов. Анализатор исходного кода не заботился бы о меньших возможностях. –

+0

@jan Уже агрессивно улучшает запуск и производительность. Кроме того, я не хочу, чтобы рекрутинговые инженеры легко копировали мои данные; зависимостей классов следует установить их на мгновение. Я предполагаю, что CodeModel не имеет каких-либо ограничений в отношении методов, правильно? –

ответ

1

Я думаю, вы должны пересмотреть свою стратегию. Моделируйте свои структуры данных и методы соответственно, и вам не нужно генерировать код. Вместо того чтобы сгенерировать код Java для 4000 констант, сохраните данные в файле или базе данных и напишите короткий метод для чтения этих данных во время инициализации, чтобы заполнить список вашими объектами данных.

Генерирующий код - мощный инструмент, но вы должны использовать его тщательно. Я не вижу, что это даже необходимо для вашего случая использования, но если вы так думаете, тогда вы можете попытаться свести к минимуму часть кода, чтобы сгенерировать до абсолютного минимума, чтобы все было просто. Часто вы можете извлечь много общего кода для абстрактного суперкласса, чтобы вам нужно было генерировать код для некоторых методов в подклассах. И генерация кода для 4000 констант действительно не нужна. Храните данные в виде данных и динамически работайте с данными.

+0

Я использовал структуру ASM, но очень похожее ограничение ограничивает файлы классов. Единственное сообщение об ошибке, которое я получил, просто «Тело метода слишком велико». –

+0

@ Matej'Yin'Gagyi Это тело метода метода инициализации специального класса '', которое должно инициализировать все константы класса. –

+0

@PauloEbermann Я вызываю инициализацию каждого метода из клиники. Не важно, как вы структурируете вызовы. Если метод слишком велик, он слишком велик. –

Смежные вопросы