不确定这是否是正确的问题,但我想知道def的Groovy关键字(以及其他动态或可选类型语言的等价物)。
这样的一个有用或好的用法是,您可以将一种类型的值分配给变量,然后将其更改为另一种类型。
例如,假设你得到一张两个时间戳的地图,这两个时间戳代表你前端的日期范围
def filters = [
from: from,
to : to
]
然后,当您进行一些验证时,您希望将日期对象中的日期范围传递给DAO以进行SQL查询,以便执行以下操作
if(filters.from && filters.to) {
def normalizedDateRange = DateUtil.buildDateRange(filters.from, filters.to, maxRangeDays)
filters.from = normalizedDateRange.from
filters.to = normalizedDateRange.to
}
这是可以接受的,您可以在不需要创建具有非常相似名称的第二张地图的情况下离开。我的问题是,如果这会导致像这样的语言过多的开销,这是他们比JAVA慢的原因之一。
有些人说你可以认为def是在Java中使用Object,所以它分配了足够的空间来存储任何东西,或者它可以存储一个引用,当你存储不同的东西时,它只是释放它所占用的空间并重新分配新的空间和只是更新参考?
我可以通过在这里创建新的对象/地图并在那里存储新值来获得任何收益吗?或者收益是如此之少,以至于最好利用糖语法和“欺骗”Groovy?
答案 0 :(得分:1)
def
会更轻,因为它只是一个空引用,以后可能很容易被垃圾收集。
通过在地图中存储变量,您可以将值存储在特定结构中,该结构可计算哈希码以及1 2。它会更重。
当然,地图有很棒的功能,人们不应该仅仅根据性能而忽略这一点而不检查它是否是真正的瓶颈。您可以尝试编写microbenchmark。
答案 1 :(得分:0)
请记住,Groovy 可选类型,而不是动态类型。因此,如果您正在编写一个包含过滤器的常量,那么您可以执行此操作以提供有关如何执行的编译器和JVM提示:
static final Map filters = [ to: 'X', from: 'Y' ]