yuu_nkjm blog
2008-12-17(Wed) 編集
[Java][Scrap] Javaの実装イロイロ
株式会社エス・ジーさんのJava講座で取り上げられていた内容のうち,僕が気になったものを抜き書きします.
2. 堅牢性を獲得する章
2.5. 配列フィールド定数 『目的』 定数として用意した配列は書きかえられないようにしましょう。 『まとめ』 書き方を改めることで「定数」となります。 final修飾子は参照を不変にするだけで内容までは不変にしてくれません。
3. 拡張性/柔軟性を獲得する章
valueOf:型変換的なファクトリーメソッド getInstance:それ以外なファクトリーメソッド
改行コードをハードコーディングしないようにします。 // 改行を文字列に含める StringBuffer str = new StringBuffer(); str.append("Hello"); // プラットフォームに適した改行コードを取得\ str.append(System.getProperty("line.separator")); str.append(name); 『まとめ』 改行コードはハードコーディングしないこと。 改行コードが欲しければSystem.getProperty("line.separator")を使うこと。
4. 知っていると便利な章
4.10. コレクションと配列のやりとり 『目的』 コレクションと配列間のやりとりを簡潔に行いましょう。 /* Collection -> 配列 */ String[] strings = (String[]) values.toArray(new String[values.size()]); 『まとめ』 Arrays.asListとCollection.toArrayの組み合わせが配列ベースのAPIとコレクションベースのAPIの橋渡しをします。 ArraysやCollectionには便利なメソッドが色々用意されているので積極的に使いましょう。
5. 最適化の章
Java講座 > 5.1. ループ条件部でメソッドコールしない
5.1. ループ条件部でメソッドコールしない ループ条件でのメソッド呼び出しを避けて実行速度を上げましょう。 List strings = Collections.synchronizedList(new ArrayList()); : for (int i = 0, n = strings.size(); i < n; i++) { : }
5.2. ループ内でインスタンス化しない 『目的』 インスタンス化方法を改善してメモリ管理の負荷を下げましょう。 ループ外で作ったものをループ内で使い回すようにします。 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); /* 使い回すので内容をクリア */ }
Java講座 > 5.3. try-catch ブロックはループ外に置く
5.3. try-catch ブロックはループ外に置く 『目的』 try-catch ブロックの書き方で実行速度を改善しましょう。 try-catch ブロックの括りを外に出してみます。 try { /* 括りをループの外に出しました */ for (int i = 0; i < MAX; i++) { FileInputStream fis = new FileInputStream("c:\\hoge\\foo\bar.dat"); } } catch (FileNotFoundException e) { /* 繰り返して行う必要がない例外処理。 */ }