2016-08-25 33 views
4

私は主にC#の開発者であるため、Javaを最後に使用してからしばらくお待ちください。ゲームに戻ってくるために、私は非常に簡単なアプリケーションを使って、言語の主要な機能のほとんどに触れていました。Javaの場合getterを使用する場合

次のように getPlayers()が定義されている
for (Player player : teamRed.getPlayers()) { 
    System.out.format("> %s\n", player.getName()); 
} 

:私は次のような問題に出会っあなたにゲッターを使用した場合、過去のある時点で

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

、C#やJavaのいずれかがパフォーマンスの問題を持っていましたそれぞれがこのように、繰り返しごとにメソッドを実行します。

Javaがこれまでにこの問題の対象となったことはありますか、それともC#の場合のみでしたか?

個人的には、私はコンパイラがこれを適切に最適化し、実際にgetPlayersの結果を反復処理する前に一時変数に格納するほどスマートでなければならないと感じます。ていない場合でも、私は何の問題コンパイラに手を助けることがありません:P

+3

([言語仕様に]文の強化見上げてhttps://docs.oracle.com/javase/specs/jls /se7/html/jls-14.html#jls-14.14.2)、「拡張されたfor文は、for文のfor文と同じです」を探します。 'getPlayers()'メソッドは仕様で一度だけ呼び出されます。 –

+2

私はこれが重複していることに同意しません。具体的には、反復処理を行うリストを取得するメソッドを使用することに関連していたことを思い出してください。リンクされた質問は、定義された配列への直接アクセスを使用します。 –

+1

私はJavaがこれまで(1.2以前から)このような問題を抱えていることを覚えていませんし、C#がそのような基本的な監督に苦しんでいたと思っています。 – Kayaman

答えて

3

は、コンパイラは、それが終わっループし、そうgetPlayers()方法は一度だけ呼び出されること(Iterableiterator()メソッドを呼び出してから)イテレータを格納します。あなたの最初のコードスニペットを実行するときは、getPlayers()

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

の下の適応を使用して一度だけ印刷される「と呼ばれるgetPlayersを()」これを観察することができました。

詳細(特にiterator()法)のためIterableドキュメントを確認してください:https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html

+0

非常に簡単で効果的です。あなたはあなたの "出力"にタイプミスがありますが、SOは私にただ1文字を編集させません:P他のコメントにも感謝します。 –

+0

タイプミスについてお知らせいただきありがとうございます – SamTebbs33

関連する問題