Groovy Meta Programming: переопределить карту invokeMethod - PullRequest
0 голосов
/ 09 мая 2019

У меня есть Java Map<String,Object>, к которому я обращаюсь, используя волшебный Groovy

myMap.property1.nestedProperty1.nestedNestedProperty

Это здорово, и я знаю, что могу безопасно перемещаться так:

myMap?.property1?.nestedProperty1?.nestedNestedProperty

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

Я думаю, что groovy реализует навигацию по графу гнезд с помощью переопределения invokeMethod.

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

Я намереваюсь переопределить только мои объекты карты metaClass.invokeMethod, а не Класс один.

PS: Я искал отличный исходный код напрасно.Может кто-то также указать, где именно Groovy реализует эту функциональность в реализациях Java Map?

1 Ответ

1 голос
/ 09 мая 2019

Одна вещь, которую вы можете попробовать, - это использовать ConfigObject, который уже имеет эту «безопасность».

ConfigObject conf = myMap as ConfigObject

Теперь вы можете сделать conf.property1.nestedProperty1.nestedNestedProperty, и он всегда разрешится, даже если на исходной карте отсутствует какой-либо уровень.

Тем не менее, результат, когда вы закончите, если какая-то часть отсутствует, не null, это ConfigObject, где isEmpty() - истина. Вы можете просто проверить это, используя instanceof, если хотите, так:

myMap?.property1?.nestedProperty1?.nestedNestedProperty

эквивалентно:

ConfigObject conf = myMap as ConfigObject
Object value = conf.property1.nestedProperty1.nestedNestedProperty
value = (value instanceof ConfigObject ) ? null: value

Вы могли бы очень легко написать метод, который выполняет вышеуказанное более аккуратно.

http://docs.groovy -lang.org / 2.4.9 / html / GAPI / заводной / Util / ConfigObject.html

...