S-JIS[2008-02-22/2010-04-28] 変更履歴

Javadoc

Javaの特殊なコメント。
コメントの書き方がルール化され、それを元に説明書を作成することが出来る。

クラス・メソッド・フィールド(変数)にJavadocコメント(説明)を付けられるので、それらの説明が見られることになる。

Javadocと言った場合、「Javadocコメントの書き方」と、それを元に生成された「API仕様(HTML文書)」のいずれかを指すことが多い。
後者は、Javaの(標準ライブラリーの)API仕様が有名。→Javadocの読み方(入門者向け)


Javadocの生成方法

Javadoc生成用のコマンドを使って、JavaのソースファイルからHTMLを生成する。

いずれの方法でも、対象となるソースファイルの数が多ければ 生成にそれなりの時間がかかる。

ひしだまが自分で生成したJavadoc


javadocコマンド

javaコンパイラー(javac)と同じ場所にjavadocというコマンドが置かれている。
これを実行すればJavadocが生成できる。

javadoc 生成対象スコープ -d 生成場所 -sourcepath ソースファイルの先頭ディレクトリー パッケージ名

> cd \workspace\project
> javadoc -public -d doc -sourcepath src jp.hishidama.sample jp.hishidama.sample2

詳細なオプションは「javadoc -help」でヘルプが見られるので、それで確認。

指定したパッケージの中にソースファイルが1つも無かったらエラーになる。
パッケージ名にはワイルドカード(*)は使えない。
また、指定したパッケージの下の階層のパッケージは対象外なので、1つ1つ個別に指定してやる必要がある?
→したがって、数が増えたらEclipseAntを使う方が便利。


Javadocの書き方(ルール)

以下のような感じ。

	/**
	 * 文字列結合.
	 * <p>
	 * 2つの文字列を結合する。<br>
	 * ただしnullの場合は空文字列として扱う。
	 * </p>
	 * 
	 * @param str1 文字列(null可)
	 * @param str2 文字列(null可)
	 * @return 結合した文字列(必ずnull以外)
	 */
	public static String concat(String str1, String str2) {
		if (str1 == null) {
			if (str2 == null) {
				return "";
			} else {
				return str2;
			}
		} else {
			if (str2 == null) {
				return str1;
			} else {
				return str1 + str2;
			}
		}
	}

/**

Javadocコメントは「/**」で始め、「*/」で終わる。
複数行にまたがる場合は、間の各行の先頭に「*」を置く。(置かなくても大丈夫ではあるが、普通は置く。置いた方が揃っていて綺麗だし。手作業だと面倒だけど、Eclipseのソース整形機能を使えば勝手に入れてくれる)

	/**
	 * サンプル
	 */
	public static final int SAMPLE = 123;

一行だけのJavadocコメントを書くことも可能。[2004-06-19]

	/** サンプル */
	public static final int SAMPLE = 123;

要は普通のコメント「/*」に対してアスタリスク「*」が1つ増えただけ。
とは言っても「//*」というのはJavadocコメントにはならない^^;


ピリオド

/**」直後の最初の文は、生成したJavadocの見出し(メソッド一覧やクラス一覧)に使われる。

“最初の文”の判断は、最初のピリオド「.」+空白文字(改行やブランク)が来るまで。
もしくは最初のブロックタグ(@author等のJavadocタグ)が来るまで。

日本語なら句点「。」も文の終わりとして欲しいところだが、javadocコマンドはそこまで対応してないわなぁ。
もっと言えば、ただ単に改行してたら終わりと見なしてくれる方がいいんだけど…メソッド名やクラス名を書きたいだけの場合でもピリオドを付けなきゃいけないので、生成されたJavadocにピリオドが付いててくどくなるんだよな〜。


HTMLタグ

Javadocコメントの説明文の中にはHTMLのタグを使うことが出来る。
Javadoc生成時には(基本的に)書いた文章はそのままHTMLのソースになるので、逆に、改行したい場合はbrタグとかを書いておく必要がある。

	/**
	 * 説明文です。<br>
	 * 改行タグを入れないと、	←ここはJavadoc生成時に改行されない
	 * 生成したときに改行されないよ。
	 */

codeタグpreタグを使って そのメソッドの使い方のサンプルを入れたりすると、見る側からすると分かり易くていいだろう。
しかしpreタグはEclipseのソース整形機能を使うと勝手に改行されたりインデントが無くなったりするのでちょっと不便。

→コードは@codeタグを使うものらしい (JDK1.5以降)


Javadocタグ

アットマーク「@」で始まる特定のキーワードはJavadocタグと呼ばれ、特殊な扱いをされる(定められた情報を持つ)。
それぞれのJavadocタグは書ける場所が決まっている。主にパッケージ・クラス・メソッド (コンストラクター)・フィールド(メンバー変数)のいずれか、またはその組み合わせ。

Javadocタグはたいてい後ろに何らかの説明文を書くが、ここにHTMLのタグを入れることも可。
また、説明文は複数行にまたがってよい。次のJavadocタグが来るまで、1つの文章(HTML)として扱われる。
(つまりJavadocコメント上での改行は自由だが、生成されたJavadocを改行した状態にしたいならbrタグ等が必要だということ)

Javadocタグ 場所 超概要 使用例 出力イメージ 備考
@author
1.0〜
C 著者 @author ひしだま
@author 小人さん
作成者:
  ひしだま, 小人さん
カンマ「,」+スペースの区切りで複数の名前を列挙できる。
または、複数行の@authorを書くことが出来る。
複数の名前を指定した場合、全部の名前が一行にカンマ区切りで出力される。
@since
1.1〜
全て 初めて作った時のバージョン @since 1.0 導入されたバージョン:
  1.0
バージョンの値をどのように書くかについては特に決まりは無い。
つまり各自のコーディング規約で定めればよい/定める必要がある。
ひしだまの場合、年月日にしてしまう。
@version
1.0〜
PC 現在のバージョン @version 1.6 バージョン:
  1.6
@param
1.0〜
M 引数(パラメーター) @param 変数名 説明文 パラメータ:
  変数名 - 説明文
変数名が実際のメソッドの引数名と一致していない場合、Javadoc生成時に警告が出る。
引数が参照型の場合、その引数がnullを許容するかどうかを明記すべきだと思う。
@return
1.0〜
M 戻り値 @return 説明文 戻り値:
  説明文
戻り値の説明(値とか)を書く。
戻り値の型が参照型の場合、nullを返すことがあるかどうかを明記すべきだと思う。
@throws
1.2〜
M 例外 @throws 例外名 説明文 例外:
  例外名 - 説明文
メソッドのthrows句に書いた例外の説明を書く。
@exceptionと同じ機能だが、@throwsの方が新しい。
@inheritDoc
1.4〜
M 親の説明 @param arg {@inheritDoc}
@return {@inheritDoc}
@throws {@inheritDoc}
  継承元の(オーバーライドされた)メソッドの該当部分(本文や@param等)に書かれた説明文(Javadocコメント)になる。[2008-12-26]
JDK1.5より前では、バグがけっこうあったようだ。
@value
1.4〜
F 定数値 値は{@value}です<br>
値は{@value #静的フィールド}
値は1 です
値は2
finalフィールドの値になる。(finalフィールド以外には使えない)[2008-12-26]
引数が無い場合はそのJavadocが付いているフィールドが対象。
引数があるとそのフィールドの値が表示されたリンクとなる。
@see
1.0〜
全て 関連項目 @see クラス名 関連項目:
  クラス名
関連のある項目(クラス・メソッド・フィールド)へのリンクを作成する。
(「関連項目」というブロックが作られる)
Eclipseだと、この@seeタグで指定しているクラス名等の上にカーソルを持っていってF3を押すと、その場所へジャンプできる。
@see クラス名#フィールド 関連項目:
  クラス名.フィールド
@see #自クラスのメソッド(引数の型) 関連項目:
  自クラスのメソッド(引数の型)
@see クラス名 ラベル 関連項目:
  ラベル
@link
1.2〜
  リンク {@link クラス名}を使用。 クラス名を使用。 クラス・メソッド・フィールドへのリンクを作成する。
@seeと異なり、文章中で使える。
{@link クラス名 ラベル}を見よ。 ラベルを見よ。
@deprecated
1.0〜
全て 非推奨 @deprecated 説明文 推奨されていません。 説明文 非推奨であることを示す。
代替するものがある場合は、それへの@see@linkを付けるべき。
@literal
1.5〜
  不等号を書ける
(テキスト用)
{@literal A<B>C} A<B>C 通常は不等号の記号をそのまま使うとHTMLのタグとして認識される[2008-12-26]
@code
1.5〜
  不等号を書ける
(コード用)
{@code List<E>} List<E> <code>{@literal }</code>」と同じ。[2008-12-26]
@serialData
1.2〜
M シリアライズ @serialData 説明   シリアライズ方法の説明を書く。[2010-04-28]
@serial
1.2〜
F @serial   シリアライズされるフィールドに付ける。[2010-04-28]
@serialField
1.2〜
F @serialField フィールド名 型 説明   serialPersistentFieldsによってシリアライズするフィールドに対する説明を書く。[2010-04-28]

“{@タグ}”という形式のJavadocタグをインラインタグと言う。これは文章中のどこにでも自由に置くことが出来る。
“@タグ”という形式のJavadocタグをブロックタグと言う。これは独立したブロック(説明箇所)が作られる。


コメントファイル

Javadocコメントは主にソースファイル内に書くが、パッケージの説明や全体の概要などの“ソースファイルには書けないもの”は別ファイルに用意する。

ファイル名 名称 備考
overview.html 概要コメントファイル javadocコマンドのオプション-overviewによってこのファイルを指定する。
package.html パッケージコメントファイル ソースファイルの置き場をパッケージ毎にディレクトリ化し、該当パッケージの下にpackage.htmlというファイル名のファイルを置くと、そのパッケージ用のJavadocとなる。
(本来ソースファイルはパッケージ毎のディレクトリに置く必要は無いのだが)
→JDK1.5以降はpackage-info.javaというファイルを使う。[2008-08-20]
package-info.java パッケージコメントファイル JDK1.5以降で、パッケージの説明を書くソースファイル。[2008-08-20]
コンパイルするとpackage-info.classが作られる。→パッケージのアノテーション[2008-08-23]

留意事項

JavadocコメントとJavadocコメントの間のコメント

例えばメソッド本体(だけ)をコメントアウトすると、Javadoc用コメントが浮いてしまって変なJavadocが生成される… [2003-07-06]

	/**
	 * 説明1
	 */
/*	public int func1() {
	}
*/
	/**
	 * 説明2
	 */
	public int func2() {
	}

…と思っていたのだけれど、JDK1.4以降のjavadocでは問題ない。[2008-02-22]


フィールドのJavadocコメント

フィールドのJavadocコメントは、1つずつ指定してやらないとおかしくなる。

	/** サンプル */
	public int n1, n2, n3;

→n1・n2・n3の全てに同じ「サンプル」という説明が生成される。

	/** サンプル */
	public int n1;
	public int n2;
	public int n3;

→n1だけ「サンプル」という説明が生成され、n2・n3には説明が付かない。


HTMLのバグ

生成されるHTMLに、一部間違っている箇所がある。[2009-02-14]
SunのJavadocのHTMLも間違っているので(苦笑)、Javadocツールのバグだろう)

クラス名のHTML

以下のようにクラス名が表示されるが、HTMLがおかしい。

public class HtParser
extends Object
<DL>
<DT><PRE>public class <B>HtParser</B><DT>extends <A HREF="〜">Object</A></DL>
</PRE>

DLのタグとPREのタグが入り繰りになっていて、片方しかマッチしない…。

使用メソッドのHTML

各クラスの説明の一番上のメニューのようなリンクから「使用」をクリックした場合、そのクラスを使用している箇所の一覧が表示される。
そこの「のメソッド」や「のサブクラス」のHTMLがおかしい。

<TH ALIGN="left" COLSPAN="2"><A HREF="〜/HtParser.html">HtParser</A> を返す
<A HREF="〜/package-summary.html">jp.hishidama.html.parser.rule</A> のメソッド</FONT>
</TH>

FONTの開始タグが無い。
ちなみに「メソッド」や「サブクラス」でなく「パッケージ」や「使用」といった行では<FONT SIZE="+2">があるのでそれにマッチしているのだが…。

定数フィールド値のHTML

Javadocのindex.htmlと同じディレクトリーに、constant-values.htmlという定数フィールド値の一覧のHTMLファイルが生成される。
この中でも開始タグの無い</font>や</td>・</tr>がある。


Java目次へ戻る / 新機能へ戻る / 技術メモへ戻る
メールの送信先:ひしだま