Developer

【はじめてのJava】初期化処理のまとめ方【オブジェクトとクラス編】
2021.08.31
Lv1

【はじめてのJava】初期化処理のまとめ方【オブジェクトとクラス編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


オブジェクトとクラス編

オブジェクトとクラス編では、Javaを扱う上で非常によく出てくる「オブジェクト」や「クラス」について扱っていきます。

前回は「コンストラクタの注意点」について扱いました。

今回は「初期化処理のまとめ方」について扱います。


目次


初期化処理のまとめ方

オブジェクトをインスタンス化する際にはコンストラクタによる初期化が実行されます。

コンストラクタが複数ある場合には、引数に合わせたコンストラクタによる初期化が行われます。
例えば、以前作成したCarクラスには「引数のないコンストラクタ」と「引数でcolorを設定可能なコンストラクタ」の2種類がありました。

図にすると以下の通り。

ソースコードは以下の通り。
Carクラス

class Car{
  double speed;
  String color;
 
  //引数のないコンストラクタ
  Car(){
    this.speed = 0;
    this.color = "red"; //colorの初期値がredになるように設定
  }

  //↓引数付きのコンストラクタ
  Car(String color){
    this.speed = 0;
    this.color = color;
  }
  
}

このCarクラスのコンストラクタをよく見ると、「speed = 0;」という部分が共通しています。

このように、すべてのコンストラクタで共通して行っている処理がある場合、どのようにプログラムを書けばよいでしょうか。

具体的に見ていきましょう。


方法1:すべてのコンストラクタに同じ処理を定義する方法

まず最初に思いつくのは、例のCarクラス同様、すべてのコンストラクタに同じ処理を定義する方法です。
この方法なら、どのコンストラクタでも同じ初期化処理を行うことができるはずです。

しかし、実際にこの方法はお勧めしません。理由は以下の通りです。

  • 同じ処理を繰り返し記述するため手間がかかる
  • プログラムが長くなり見づらくなる
  • プログラムが増える分ミスする可能性が増える
  • 修正する場合に手間がかかる
  • 修正する場合に修正漏れを起こす可能性が上がる

このような理由から、共通の初期化処理は1か所にまとめたいことが多いです。

では、いったいどのようにして初期化処理をまとめればよいのでしょうか。

次の方法を見てみましょう。


方法2:イニシャライザを定義する

Javaには イニシャライザ と呼ばれるものがあります。イニシャライザはインスタンス化の際に コンストラクタよりも先に動作します 。また、どのコンストラクタが呼び出されたかに関係なく動作します
そのため、 共通処理をイニシャライザの中にまとめることができます 

イニシャライザの書き方は以下のようにクラスの直下に{ }を直接書きます

イニシャライザの書き方

class Sample{
  //イニシャライザ
  {
    //ここにイニシャライザで行いたい処理を書く
  }
}

イニシャライザはコンストラクタとは本質的には少し異なるのかもしれませんが、動くタイミングが似ているので比較してみましょう。

イニシャライザとコンストラクタを両方書いた場合を図にすると次のようなイメージです。

ソースコードとして書くと次のようになります。

イニシャライザとコンストラクタ

class Sample{
  //イニシャライザ
  {
    //イニシャライザで行いたい処理
    //インスタンス化の際に必ず実行される
  }

  //コンストラクタ
  Sample(){
    //コンストラクタで行いたい処理
    //インスタンス化の際の引数に応じて該当するコンストラクタの処理が実行される
  }
}

イニシャライザとコンストラクタの違いは次の通りです。

  • イニシャライザ
    • 定義する際にクラスの直下に{ }のみで定義する
    • どのコンストラクタが呼び出されても必ず動作する
    • コンストラクタより先に動作する
  • コンストラクタ
    • 定義する際には、戻り値がなくクラス名と同名のメソッドとして定義する
    • 引数が合致するコンストラクタのみが動作する
    • イニシャライザの後に動作する

イニシャライザを具体的に使った例は次の記事で紹介予定です。


方法3:別のコンストラクタを呼びなおす

イニシャライザを使った方法以外に、別のコンストラクタを呼びなおすこともできます。

イメージは次の図の通りです。

基本的には「イニシャライザ」にまとめる方が簡潔ですが、クラスの設計によってはこちらも利用可能です。
少なくともJava Silverの試験を受ける場合は必須の内容です
こちらは少々説明が必要ですので、詳しくは別の記事で紹介予定です。


まとめ

インスタンス化の際の共通処理はまとめることが可能
まとめる場合はイニシャライザを利用する
クラスの設計によってはほかのコンストラクタの呼び出しも利用可能

次回

次回も引き続きクラスやオブジェクトに関する内容を扱います。


はじめてのJavaシリーズの目次はこちら
オブジェクトとクラス編はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら