2014-09-29 62 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(...)))。