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)); }