2014-09-29 92 views
0

我有以下代碼Java的隊列評估順序

myQueue.offer(new myObj(
    fcnA, 
    Collections2.transform(...), 
    Collections2.transform(...) 
)) 

我的問題是在什麼時候被Collections2.transform(...)評估?

我的猜測是,直到從隊列中調用myObj的創建纔會發生這種情況。它是否正確?

+3

我們沒有足夠的上下文來說實話 - 除了其他任何東西之外,它取決於你的意思是「什麼時候對Collections2.transform(...)進行評估」 - 如果你在這個轉換中已經有了動作,很可能是執行了'transform',但它會返回一個值,稍後將執行單個動作。 – 2014-09-29 16:09:21

回答

2

總之,是的,它會在構造函數被調用時被評估。

請參閱Java語言規範(JLS),15.12.4.2. Evaluate Arguments,特別是最後2段和Example 15.12.4.1-2. Evaluation Order During Method Invocation

+0

這是真的,但可能非常不相關,因爲'Collections2.transform'沒有任何功能。它只創建一個'TransformedCollection',它是* lazy *。所以你完全回答了OP的要求,但可能錯過了他們需要知道的內容。 – maaartinus 2014-09-29 18:48:42

+0

@maaartinus,你可以自由投票給我,完全回答問題,而不是假設告訴他我認爲他需要知道什麼。 – Paul 2014-09-29 19:29:49

+0

沒有理由downvote。我只想讓每個人都看着你的答案,看看還有更多需要考慮的事情。 – maaartinus 2014-09-29 19:40:20

1

Collections2看起來像一個番石榴類。如果是這樣,那麼transform()會返回一個惰性集合,即實時視圖到源集合中。當你通過Collection接口實際訪問colections的元素時(可能是在迭代集合時),將評估所有操作。

如果您需要有一個集合的轉換副本,您需要自己複製副本(例如new ArrayList(Collections2.transform(...)))。