2015-06-19 3 views
0

У меня есть класс, который можно создать, передав список строк или передав файл. Файл будет проанализирован, создав список строк. Так что это действительно вспомогательный конструктор.Groovy lazy object construction

Разбор файла может занять много времени, и результирующий список строк может не использоваться когда-либо (даже если объект создан так или иначе). Поэтому у меня возникла идея «ленивого разбора» файла, чтобы файл фактически разбирался только перед использованием некоторых методов этих объектов.

Есть ли способ сделать это в хорошем или даже лучшем способе добиться того, чего я хочу?

+1

Вы просмотрели аннотацию '@ Lazy' за вашу собственность, да? http://docs.groovy-lang.org/latest/html/documentation/#xform-Lazy –

ответ

0

Я использовал обходное решение сейчас. Я сохраняю как файл, так и список строк, заданный в одном из конструкторов в полях (другой - null). Затем я создаю третье ленивое поле, которое обращается к ненулевому свойству (независимо от того, что оно есть), и если это файл, который он анализирует.

Это довольно сложно, но я думаю, что это единственный способ использовать ленивость с аргументами, переданными в конструктор, которые должны оцениваться лениво.

0

Не разбирайте содержимое в конструкторе, просто сохраните параметры конструктора String или File в атрибутах вашего класса. Затем создайте новый метод с медленным анализом, используя предыдущие атрибуты. Наконец, вы можете кэшировать результат, аннотируя этот метод с помощью аннотации @Memoized Groovy.

+0

Это не работает в моем случае, потому что я храню анализируемую информацию в аннотированной переменной '@ Delegate'. Иначе ваше решение, безусловно, было бы предпочтительным. – valenterry

+0

Хорошо, тогда это другая проблема :). Поместите здесь свой код и давайте попробуем разобраться. – albertovilches