Вчера в статье про лямбда-функцию для удобной работы с DTO я написал, как создавался Live Template в IDEA. Сегодня, на другом компьютере, передо мной снова встала та же самая задача, и был выбор: взять готовый живой шаблон или попробовать другим способом. Я решил выбрать второй вариант. Вообще говоря, он даже проще и возможно, лучше. На этот раз названия переменных будут несколько отличаться: dto
и target
. Начну с того, что напишу необходимые методы в три строчки, затем воспользуюсь заменой с использованием регулярных выражений:
dto.getIndex()
dto.getType()
dto.getName()
Заменим dto.get(.*)\(\)$
на Optional.ofNullable(dto.get$1()).ifPresent(target::set$1);
и всё, должно получиться:
Optional.ofNullable(dto.getIndex()).ifPresent(target::setIndex);
Optional.ofNullable(dto.getType()).ifPresent(target::setType);
Optional.ofNullable(dto.getName()).ifPresent(target::setName);
До тех пор, пока внутри не другой DTO, всё работает прекрасно и даже лучше предыдущего метода. Так, да не так. Во-первых, надо думать над регэкспом, чтобы написать его так, чтобы не пострадал другой код (подсказка: можно сделать это в Scratch File или применив регулярное выражение лишь к текущему выделению). Во-вторых, IDEA не очень нравится, когда строчки не являются валидным кодом, она начинает городить лесенку. Лесенка ничем не помешает, к тому же потом можно просто переформатировать код и всё, но это неудобно :).
Теперь про регулярное выражение. Я использовал в регэкспе последним символом знак $
, чтобы не задеть существующий код. Также можно было бы этот знак убрать, но выполнить замену только в пределах выделенного кода (само собой, предварительно всё так же написав список методов и выделив его). В таком виде, как сейчас, регулярку можно вызывать неограниченное количество раз. На самом деле чаще всего так и будет, потому что никогда не знаешь, в какой момент в модели всё же появится новое поле, а писать новую строчку всё-таки очень неудобно.
И меня всё ещё не оставляет мысль о том, чтобы сделать автоматический генератор кода, чтобы он работал с любыми полями и сам, автоматически. Все необходимые аннотации под генератор [Mapstruct] (http://mapstruct.org/) в проекте уже есть, так что вполне органичным и естественным кажется либо написание некого плагина к mapstruct, либо наследника от их генератора, либо тупо просто добавить соответствующий код в их проект. Как бы ни была удобна IDEA, когда всё делается автоматически - это ещё удобнее и надёжнее. И всё как я люблю: лучше день потерять, а потом за пять минут долететь.