Является ли объявление переменной с пустой картой, а затем присвоение ей другого объекта эффективным шаблоном?
Мы разрабатываем проект Grails, и я новичок в Grails/Groovy, и я вижу шаблон, в котором мы определяем переменную как пустую карту в контроллере, а затем в методе службы также определяем другую пустую карту и заполняем ее пары ключ / значение из БД.
Я утверждаю, что эта модель расточительна. Мы назначаем пустую карту переменной контроллера, только чтобы создать другую карту в сервисе, а затем назначаем карту сервиса переменной контроллера, таким образом теряя пустую карту, созданную в контроллере, и освобождая ее для сбора мусора.
Коллега утверждает, что данные из сервисной карты попадают в карту контроллера, так что используется оригинальная карта, созданная в контроллере, и поэтому объявляет, что она не является расточительной.
Что на самом деле происходит? Эта первая карта контроллера создается только для сбора мусора, или она каким-то образом заполняется данными в служебной карте?
Контроллер метод:
getMap() {
....
def output = [:]
output = someService.getHashMap()
...
}
Метод обслуживания:
getHashMap() {
...
def output = [:]
output = [key0: 'value0', key1: 'value1', key2: 'value2']
}
3 ответа
Нет веских причин делать что-то подобное...
def output = [:]
output = [key0: 'value0', key1: 'value1', key2: 'value2']
Может быть, это поможет прояснить, что происходит. Следующее эквивалентно коду выше...
def output = new LinkedHashMap()
output = new LinkedHashMap()
output.put 'key0', 'value0'
output.put 'key1', 'value1'
output.put 'key2', 'value2'
Это установка ссылки на объект, которая никогда не используется для переменной, а затем установка другой ссылки на другой экземпляр карты (вероятно, созданный внутри службы). Сборщик мусора собирается удалить первую пустую карту, это не является большой проблемой производительности, но ее легко избежать. Чтобы добавить содержимое карты, вам нужно будет использовать putAll
или оператор левого смещения <<
,
Я бы лично возмутился (я знаю, это сильное слово), переназначая значения переменной. Следующий (безобразный) шаблон - один из главных корней зла в вашем коде:
def x = foo()
// do something with 'x'
...
x = bar()
// do something else with 'x'
Это может легко усложнить понимание кода и привести к ошибкам. Вы должны постоянно следить за x
чтобы убедиться, что он содержит значение, которое он должен! В самом деле! Просто создайте другую переменную для хранения второго значения; в этом нет абсолютно ничего плохого - времена 64КБ памяти давно прошли.
def fooX = foo()
// do something with 'fooX'
...
def barX = bar()
// do something with 'barX'
Это делает чтение кода и понимание его поведения намного проще.
Лично, когда я пишу код, который нужно переназначить для переменной, я быстро понимаю, что с организацией моего кода что-то не так. Я делаю это ТОЛЬКО в крайне редких случаях.