2016-08-04 20 views
0

不知道這裏是否是一個正確的問題,但我想知道def(和其他動態或可選類型語言的等價物)的Groovy關鍵字。def關鍵字的Groovy開銷

這樣的一個有用的或很好的用法是,您可以將一種類型的值分配給一個變量,然後將其更改爲另一種類型。

舉例來說,假設你得到的地圖一兩個時間戳表示從前端的日期範圍

def filters = [ 
       from: from, 
       to : to 
     ] 

然後當你做一些驗證要在Date對象的日期範圍傳遞到您的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的「作弊」更好?

回答

1

def會更輕,因爲它只是一個空的參考,它可能很容易被垃圾收集。

通過在地圖中存儲變量,您正在存儲特定結構中的值,該值用於計算哈希碼以及什麼不是12。它會更重。

當然,地圖具有很好的功能,不應僅僅基於性能而忽略它,而不會檢查它是否是真正的瓶頸。你可以嘗試寫一個microbenchmark

0

請記住,groovy是可選鍵入,不動態類型。所以,如果你正在編寫持有過濾器的常數,你可以做到這一點給編譯器和JVM暗示該怎麼做:

static final Map filters = [ to: 'X', from: 'Y' ]

+0

呀,對不起。然而,這是重點。類型存在。它們在運行時解決。但是,您可以將新類型分配給現有變量。我認爲會發生什麼是新內存是根據所需的新類型分配的。這就是爲什麼在我的例子中,從一開始到一開始都很長,然後他們成了日期。我的問題是,我們是否應該利用這種可選語言的可能性,或者實際上是否投入了更多的開銷/負載/任何東西 –