使用空映射声明变量,然后为其分配一个有效模式的不同对象?

时间:2015-05-19 18:27:55

标签: oop object grails groovy

我们正在开发一个Grails项目,我是一个Grails / Groovy新手,我看到一个模式,我们在控制器中将变量定义为空映射,然后在服务方法中定义另一个空映射,并且使用DB中的键/值对填充它。

我的论点是这种模式很浪费。我们将空映射分配给控制器变量,仅在服务中创建另一个映射,然后将服务映射分配给控制器变量,从而孤立控制器中创建的空映射,并将其释放以进行垃圾收集。

同事认为,来自服务地图的数据最终会出现在控制器地图中,因此正在使用控制器中创建的原始地图,因此声明它并不浪费。

真正发生了什么?第一个控制器映射是否仅被创建为垃圾收集,还是以某种方式填充服务映射中的数据?

控制器方法:

getMap() {
    ....
    def output = [:]
    output = someService.getHashMap()
    ...
}

服务方式:

getHashMap() {
    ...
    def output = [:]
    output = [key0: 'value0', key1: 'value1', key2: 'value2']
}

3 个答案:

答案 0 :(得分:2)

它正在设置一个永远不会用于变量的对象引用,然后设置另一个不同地图实例的引用(可能在服务中创建)。垃圾收集器将删除第一个空映射,这不是一个大的性能问题,但很容易避免。 要添加地图内容,您需要使用putAll或左移操作符<<

答案 1 :(得分:2)

没有充分理由做这样的事情......

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'

答案 2 :(得分:1)

我个人怨恨(我知道;这是一个强有力的词)重新为变量赋值。以下(丑陋)模式是代码中邪恶的主要根源之一:

def x = foo()
// do something with 'x'
...
x = bar()
// do something else with 'x'

这很容易理解代码非常困难并引入错误。你必须时刻关注x以确保它包含它应该具有的值!真! 只需创建另一个变量来保存第二个值;绝对没有没有错误 - 64KB内存的日子早已不复存在。

def fooX = foo()
// do something with 'fooX'
...
def barX = bar()
// do something with 'barX'

这使得阅读代码并理解其行为变得更加容易。

就个人而言,当我编写需要重新分配给变量的代码时,我很快意识到我组织代码的方式有问题。我只在极少数情况下这样做。