SlideShare a Scribd company logo
1 of 16
Effective Java 輪読会
Item 43-44
開発部 陳映融 2014/2/12
第7章 メソッド
 項目38 パラメータの正当性を検査する
 項目39 必要な場合には、防御的にコピーする
 項目40 メソッドのシグニチャを注意深く設計する
 項目41 オーバーロードを注意して使用する
 項目42 可変長引数を注意して使用する
 項目43 null ではなく、空配列か空コレクションを返す
 項目44 すべての公開 API 要素に対してドキュメントコメントを書
く
2
Item 43
null ではなく、空配列か空コレクションを返す
目当ての物がないときは何を返す?
4
 店でチーズを買おうとしたら、チーズがない状況
 チーズがないという特別な状況のため、余分な処理が必要となる
private final List<Cheese> cheesesInStock = ...;
/**
* @return 店にあるすべてのチーズを含む配列、もしくは、
* 買えるチーズがなければ null。
*/
public Cheese[] getCheeses() {
if (cheesesInStock.size() == 0) // なぜかチーズがない状況を特別扱いにする
return null;
...
}
Cheese[] cheeses = shop.getCheeses();
if (cheeses != null && // 戻り値を使う前に余分な null チェックが必要
Arrays.asList(cheeses).contains(Cheese.STILTON))
System.out.println("Jolly good, just the thing.");
なぜ null を返す?
5
 主張:『配列を割り当てるコストを回避できるので、空配列よりも
好ましい』
 反論1:そのメソッドがパフォーマンス上の本当の原因?プロファ
イリングでそう示された?でなければ、そのレベルで心配すること
ではない
 それって、時期尚早の最適化かもしれない
 項目55 「注意して最適化する」を参照
 反論2:項目を一つも返さない呼び出しすべてが、同一の長さゼロ
の配列を返すことが可能。割り当てるコストはかからない
 長さゼロ配列は不変
 不変オブジェクトは制限なく共有しても問題ない
 項目15 「可変性を最小限にする」を参照
コレクションから配列を返す方法
6
 コレクションから指定した型の配列を書き出すための標準イデオム
// コレクションから配列を返す正しい方法
private final List<Cheese> cheesesInStock = ...;
private static final Cheese[] EMPTY_CHEESE_ARRAY = new Cheese[0];
/**
* @return 店にあるすべてのチーズを含む配列。
*/
public Cheese[] getCheeses() {
// Collections.toArray(T[])の仕様は、
// 入力配列がコレクションを保持するのに十分な大きさであれば、入力配列を返すことを保証する
// したがって、空配列を割り当てることはない
return cheesesInStock.toArray(EMPTY_CHEESE_ARRAY);
}
コレクションを返すメソッドの場合
7
 同一の不変の空コレクションを返すことはできる
 ちなみに
 Collections.emptyList や emptySet、emptyMap があるが
 Arrays.emptyArray はない(項目25参照)
// コレクションのコピーを返す正しい方法
public List<Cheese> getCheeses() {
if (cheesesInStock.isEmpty())
return Collections.emptyList();
return new ArrayList<>(cheesesInStock);
}
まとめ
8
 配列やコレクションを返すメソッドが、空配列や空コレクションの
代わりに、null を返すべき理由は決してない
 配列を返すメソッドの戻り値として空配列を返す場合、同一の長さ
ゼロ配列を返す
 コレクションを返すメソッドの戻り値として不変の空コレクション
を返す場合は、Collections.emptyXXX メソッドを使用する
Item 44
すべての公開 API 要素に対して
ドキュメントコメントを書く
API のドキュメント
10
 Javadoc
 ドキュメンテーションコメント、またはドキュメントコメントと呼ばれ
たもの
 ソースコードから自動的に API ドキュメント(HTML)を生成する
 規約: “How to Write Doc Comments for the Javadoc Tool”
 ドキュメントコメントの記述対象
 すべての公開されている物※の宣言の前にドキュメントコメントを書く
 保守可能なコードを書くためには、ほとんどの公開されていない物※に対
しても書くべき
 ドキュメントコメントの保守コストを考慮すればコードの可読性を上げる方向
もある
※クラス、インタフェース、コンストラクタ、メソッド、フィールド
ドキュメントコメントの記述原則
11
 対象要素共通
 最初の一文に概要説明を記述する
 クラス
 シリアライズ可能であれば、シリアライズ形式を文書化すべき
 スレッド安全性について記述すべき(項目70)
 ジェネリック型の型パラメータを文書化すべき
 enum 型は public メソッドだけでなく、定数も文書化する
 アノテーション
 すべてのメンバーを文書化する
ドキュメントコメントの記述原則
12
 メソッド
 メソッドのクライアントとの間の契約を簡潔に記述すべき
 何を行っているかを述べる。どのように処理を行っているかではない
 ただし、継承のために設計されたクラスでのメソッドは例外(項目17)
 @param タグ:すべてのパラメータに対して記述
 @return タグ:戻り値があれば
 @throws タグ:スローするすべての例外に対して記述 (項目62)
 すべての事前条件と事後条件を列挙すべき
 メソッドの副作用も文書化すべき
 ジェネリックメソッドの型パラメータを文書化すべき
ドキュメントコメントの記述原則
13
 コード例を記述する場合は Javadoc の {@code} タグが好ましい
 {@code} タグ内の HTML メタ文字はそのまま使用できる
 HTML の <code> や <tt> タグだと、メタ文字をエスケープする必要が
ある
 単語 “this” の使用について
 慣習的、呼び出されたインスタンスメソッドのオブジェクトのことを指
す
 HTML メタ文字(<, >, &)の生成は {@literal} タグが良い
 変換後のドキュメントだけ考えるなら “&lt;” “&gt;” “&amp;” でも
いいが
 ソースコードと生成結果の両方の読みやすさを意識すべき
実務においてのドキュメントコメント
14
 概要説明の記述慣例
 メソッドやコンストラクタ:処理を説明する動詞句
 クラス、インターフェイス、フィールド:表される事柄を説明する名詞句
 パッケージレベルのドキュメントコメント
 Java 1.5 以降は package-info.java に書くべき
 パッケージ宣言とパッケージアノテーションを入れることできる(必須
ではない)
 メソッドコメントは {@inheritDoc} タグで内容を一部継承できる
 スーパークラスよりインターフェイスが優先される
 継承することで文書を再利用可能(独自の制約があって、使いにくいけ
ど...)
 必要があれば、外部文書へのリンクを含む
ドキュメントコメントの継承例
15
 サンプルのクラス図
 Javadoc 生成結果
file:///item44_javadoc/item44/package-tree.html
これらのクラスのメソッドに{@inheritDoc}を記述
まとめ
16
 すべての公開 API 要素に対してドキュメントコメントを記述
 ドキュメントコメント内で標準規約に従った統一されたスタイルを
採用
 ドキュメントコメント内の HTML メタ文字は取扱い要注意

More Related Content

More from Appresso Engineering Team

Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Appresso Engineering Team
 
Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Appresso Engineering Team
 
Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Appresso Engineering Team
 
Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Appresso Engineering Team
 
Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31Appresso Engineering Team
 
Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Appresso Engineering Team
 
Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25Appresso Engineering Team
 
Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22Appresso Engineering Team
 
Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17Appresso Engineering Team
 
Effective java 輪読会 第3章 項目11, 12
Effective java 輪読会 第3章 項目11, 12Effective java 輪読会 第3章 項目11, 12
Effective java 輪読会 第3章 項目11, 12Appresso Engineering Team
 

More from Appresso Engineering Team (20)

Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70
 
Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68
 
Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73
 
Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)
 
Effective Java 輪読会 項目63-65
Effective Java 輪読会 項目63-65Effective Java 輪読会 項目63-65
Effective Java 輪読会 項目63-65
 
Effective Java 輪読会 項目60-62
Effective Java 輪読会 項目60-62Effective Java 輪読会 項目60-62
Effective Java 輪読会 項目60-62
 
Effective java 輪読会 項目57-59
Effective java 輪読会 項目57-59Effective java 輪読会 項目57-59
Effective java 輪読会 項目57-59
 
Effective Java 輪読会 項目49-52
Effective Java 輪読会 項目49-52Effective Java 輪読会 項目49-52
Effective Java 輪読会 項目49-52
 
Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48
 
Effective Java 輪読会 項目53-56
Effective Java 輪読会 項目53-56Effective Java 輪読会 項目53-56
Effective Java 輪読会 項目53-56
 
Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42Effective Java 輪読会 第7章 項目41-42
Effective Java 輪読会 第7章 項目41-42
 
Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40Effective Java 輪読会 第7章 項目38-40
Effective Java 輪読会 第7章 項目38-40
 
Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37
 
Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34
 
Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31Effective java 輪読会 第6章 項目30-31
Effective java 輪読会 第6章 項目30-31
 
Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29
 
Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25
 
Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22
 
Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17
 
Effective java 輪読会 第3章 項目11, 12
Effective java 輪読会 第3章 項目11, 12Effective java 輪読会 第3章 項目11, 12
Effective java 輪読会 第3章 項目11, 12
 

Recently uploaded

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 

Recently uploaded (9)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 

Effective Java 輪読会 第7章 項目43-44