Effective Java(項目28〜29)

昨日はお休みでした。気を取り直して再開。
○項目27 nullではなく、長さゼロ配列を返す

  • 以前やりました

http://d.hatena.ne.jp/shaw27/20060726/1153866783

○項目28 すべての公開API要素に対してドキュメントコメントを書く

  • ドキュメントコメントをちゃんと書きましょうというお話
  • メソッドに関するドキュメントコメントは、メソッドとそのクライアント間の契約を簡潔に記述すべき
    • メソッドがどのように処理を行っているか、ではなく、何を行っているかを述べる
    • メソッドの全ての事前条件と事後条件を列挙する
    • メソッドのいかなる副作用も文書化すべき
    • 全てのパラメータに対する@paramタグ、戻り値があれば@returnタグ、スローされる全ての例外に対する@throwsタグ

  • その他、概要説明の際のHTMLのスタイルに絡む話もある、が細かくは割愛

→一点だけ、HTMLメタ文字はエスケープする必要がある

○項目29 ローカル変数のスコープを最小限にする

  • C言語ではローカル変数をブロックの先頭で宣言しなければならない

Javaでは文が書ける場所であれば、どこでも変数を宣言できることを忘れず、活用する

  • ローカル変数のスコープを最小限にする最も強力な方法はローカル変数が初めて使用された時に宣言すること
    • 使用される前に宣言されているならば、それは散らかっているに過ぎない
    • 読み手の注意を逸らしてしまう
    • ローカル変数を早めに宣言することは、ローカル変数のスコープをかなり前方から始めるだけでなく、後方まで広げてしまうことでもある

  • ほとんどのローカル変数宣言は、初期化子を含んでいるべき

→変数を合理的に初期化するのに十分な情報がなければ、情報が得られるまで宣言を先送りすべき

  • try-catch周りは例外
    • 変数がチェックされる例外をスローするメソッドで初期化されるならば、その変数はtryブロック内で初期化されなければならない(ん?ちょっとわからん・・・)
    • 変数がtryブロックの外でも使用されるのであれば、その変数はtryブロックの前に宣言されなければならない

→これらの場合「合理的な初期化」をすることはできない

  • ループ変数の内容がループが終了した後に必要ない場合には、whileループよりforループを選ぶ(なるほど!!)
  • ループ検査がメソッド呼出しを伴い、そのメソッド呼出しがループごとに同じ結果を返すことが保証されている場合

→例えば以下のようなイデオムを用いることは、スコープ、パフォーマンスの両面から有益

// ランダムアクセスリストをイテレートするための高速なイデオム
for (int i = 0, n = list.size(); i < n; i++) {
  doSomething(list.get(i));
}