2016-08-25 64 views
4

自从我最后一次使用Java以来​​已经有一段时间了,因为我主要是C#开发人员。为了回到游戏中,我正在研究一个非常简单的应用程序来触及该语言的大多数关键功能。对于每个人都有一个getter

for (Player player : teamRed.getPlayers()) { 
    System.out.format("> %s\n", player.getName()); 
} 

getPlayers()定义如下:我碰到以下问题跑

public Iterable<Player> getPlayers() { 
    return Collections.unmodifiableList(this.players); 
} 

在过去的某个点上,无论是C#或Java有一个性能问题,当您在使用一个getter你对于每个像这样的每个迭代都会执行的方法。我再也找不到任何东西了,所以我想知道:

Java是否曾经受到过这个问题,或者仅仅是C#而已?

就我个人而言,我觉得编译器应该足够聪明来正确优化它,并在迭代之前将getPlayers的结果实际存储在临时变量中。但如果没有,我没有问题帮助编译手:P

+3

查找增强的for语句[在语言规范(https://docs.oracle.com/javase/specs/jls /se7/html/jls-14.html#jls-14.14.2),请查找“增强的for语句等价于表单的基本语句”。你会发现'getPlayers()'方法只按规范调用一次。 –

+2

我不同意这是重复的。我记得它特别涉及到使用一种方法来检索你想要迭代的列表。链接的问题使用直接访问定义的数组。 –

+1

我不记得Java从来没有遇到过这样的问题(因为在1.2之前),而且我很难相信C#也会遭受这样的基本监督。 – Kayaman

回答

3

编译器将存储迭代器(从呼吁Iterableiterator()法),它遍历,所以getPlayers()方法才会被调用一次。你可以使用getPlayers()

public Iterable<Player> getPlayers() { 
    System.out.println("getPlayers() called"); 
    return Collections.unmodifiableList(this.players); 
} 

以下适应当运行你的第一个代码片段遵守本,“getPlayers()被称为”只会打印一次。

检查Iterable文档的更多详细信息(尤其是iterator()法):https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html

+0

非常简单但有效。你的“输出”中有一个错字,但是SO不会让我编辑一个字符:P同样感谢所有其他评论。 –

+0

谢谢你让我知道错别字 – SamTebbs33

相关问题