5.2. ループ内でインスタンス化しない
『目的』
インスタンス化方法を改善してメモリ管理の負荷を下げましょう。
『Before』
ループの内部で一時オブジェクトを生成すると、
メモリを管理するためにより多くの負荷がかかってしまう可能性があります。
これは、ループ内で一時オブジェクトを生成しています。
for (int i = 0; i < max; i++) {
StringBuffer sb = new StringBuffer();
sb.append("loop: ");
sb.append(i);
System.out.println(sb.toString());
}
毎回StringBufferを作っているためメモリ管理に負荷がかかります。
『After』
ループ外で作ったものをループ内で使い回すようにします。
StringBuffer sb = new StringBuffer(); /* ループ外に出した */
for (int i = 0; i < max; i++) {
sb.append("loop: ");
sb.append(i);
System.out.println(sb.toString());
sb.setLength(0); /* 使い回すので内容をクリア */
}
ループを繰り返しても、インスタンスは一つだけなのでメモリ管理に負荷はかかりません。
『まとめ』
使い回せるのであれば、ループ内でインスタンス化するのは控えましょう。
大きなインスタンス(コンストラクタにおける処理コストが大きい)の場合は
実行時間にも差が出てくるでしょう。