2016-08-25 66 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

相關問題