Javaのクラスの半分以上は、引数なしのコンストラクタを持たない


よく使うJavaのクラスは、たいてい引数なしコンストラクタを持っています。

List<String> list = new ArrayList<String>();
Calendar calendar = new Calendar();

でも、引数なしコンストラクタを持たないクラス*1も結構あります。

InputStream inputStream = new FileInputStream(file);
TrayIcon tryaIcon = new TrayIcon(image);


全体的に見てみると、引数なしのコンストラクタを持つクラスと持たないクラス、どちらが多いんでしょうか。

調査結果

以下の条件で、調べてみました。

  • java, javaxパッケージ
  • public クラス
  • 廃止されたクラス(Deprecated)、抽象(Abstract)クラス、アノテーション、例外(Throwable, Exception)、列挙(Enum)、public コンストラクタを1つも持たないクラス*2は除外
分類 クラス数
引数なしコンストラクタを持たない
FileInputStream、など)
796個(59%)
引数なしコンストラクタを持つ
ArrayList、など)
553個(41%)*3

全体としては、引数なしのコンストラクタを持たないクラスの方が多いようです。


引数なしコンストラクタが少ない理由

「引数なしのコンストラクタがない」ということは、インスタンス化の際に何らかのデータが必須ということです。
たとえば、FileInputStreamクラスは、インスタンス化の際に "読み込み対象のファイル" の指定が必須になっています(引数なしのコンストラクタがないので、ファイルを指定しないでインスタンス化することはできません)。
大抵の場合、それぞれのインスタンスは固有のデータを持ちます*4。その固有のデータを、あとから別にセットさせるのではなく、コンストラクタで強制的にセットさせることによって、分かりやすく、ミスもなくなるように設計しているんだと思います。

引数なしコンストラクタの用途

とはいっても、引数なしコンストラクタが全くないわけではありません。

  • 自明なデフォルト値がある*5
  • あとでデータを追加/削除する*6
  • 親クラスで処理をするので、継承のためにしょうがなくインスタンスを作る*7

ただ、このような場合でも引数ありのコンストラクタを一緒に用意してあることが多いようです(Calendarクラス、など)。


引数なしコンストラクタが多いなら、それは手続き型のプログラム?

APIはこのように設計されていても、仕事でほかの人が作ったプログラムを読んでいると、引数なしコンストラクタしかないということがとても多いです。
そうやって作られたプログラムは、たいてい手続き型プログラムになってしまっています。


そもそも、「あるインスタンスにはそれ固有のデータがある」というのはオブジェクト指向の発想です。それを考えると、引数なしのコンストラクタがどれだけあるかは、手続き型プログラムかオブジェクト指向プログラムかを判断する、一つの指標になるのかもしれません。

*1:インスタンスを生成する際に何らかのデータが必須なクラス、といった方がわかりやすいかも。

*2:FilterInputStream や LockSupport など

*3:このうち、引数なしコンストラクタしかないのは300、引数なし/あり両方のコンストラクタを持つのが253

*4:インスタンス固有のデータを持たないなら、わざわざインスタンスを作る意味がありません。

*5:Calendar や Date など。(Oracle Technology Network for Java Developers | Oracle Technology Network | OracleOracle Technology Network for Java Developers | Oracle Technology Network | Oracle

*6:ArrayList や HashMap など。(Oracle Technology Network for Java Developers | Oracle Technology Network | OracleOracle Technology Network for Java Developers | Oracle Technology Network | Oracle

*7:XMLFormatter や Encoder など。フォーマッターやパーサー系に多いようです。(Oracle Technology Network for Java Developers | Oracle Technology Network | OracleOracle Technology Network for Java Developers | Oracle Technology Network | Oracle