Groovy-карта: каждый раз требуется новый экземпляр - PullRequest
0 голосов
/ 01 сентября 2018

Мое требование - получать НОВЫЙ экземпляр каждый раз, когда я получаю доступ к значению в MAP.

MyObject {
    def type
}


def myMap = [
"key1" : new MyObject()
]

def obj1 =  myMap.get("key1")
def obj2 =  myMap.get("key1")

Могут ли obj1 и obj2 быть двумя разными случаями? Как он будет вести себя, если выполняется / доступен параллельно?

1 Ответ

0 голосов
/ 01 сентября 2018

не знаю, каков ваш вариант использования, но я думаю, у меня есть ответ на ваш вопрос:

def myMap = [
  "key1" : new MyObject()
]

Просто сначала создайте новый объект, а затем сохраните этот объект на карте. Поэтому каждый раз, когда вы получаете к нему доступ, вы получаете один и тот же объект.

Чтобы создать описанное вами поведение, вам нужно добавить что-то динамическое на карту - закрытие!

def myMap = [
  "key2" : {-> new MyObject()}
]

но теперь myMap.get("key2") по-прежнему возвращает всегда то же самое - закрытие. Но если вы выполняете его, вызывая myMap.get("key2")() (или короткий myMap.key2), вы каждый раз получаете новый объект!

К сожалению, это близко, как вы получите. Я надеялся сделать трюк с ключом под названием getKey3 - я надеялся, что Groovy при обращении к key3 будет вызывать это «getter», но, похоже, это не так.

В Groovy есть и другие «хитрости», которые могут помочь вам в достижении вашей цели (например, MetaProgramming), но я думаю, что есть лучшее решение, если бы мы знали ваш вариант использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...