値の設定と取得をまとめて管理する、Javaプログラミングにおける「値を設定するメソッド」「値を取得するメソッド」

Javaプログラミングでは、メンバ変数の値を設定、取得する処理が、ソースコードのあちらこちらでよく見られます。

メンバ変数の値をしっかりと管理するために、メンバ変数の値を設定、取得する処理を、メソッドでまとめる方が良いですか?

メンバ変数の値を設定、取得する処理は、メソッドでまとめる方が良いです。
値を設定、取得する処理を、メソッド内で堅牢に管理できるからです。

「値を設定するメソッド」「値を取得するメソッド」を、適切に作成してください。
そうしたら、メンバ変数の値を保護できます。

setやgetを使う、Javaプログラミングで「値を設定するメソッド」「値を取得するメソッド」の名前の付け方

まずは、「値を設定するメソッド」「値を取得するメソッド」の名前の付け方について、お話したいと思います。

Javaプログラミングにおける

  • メンバ変数の値を設定するメソッド
  • メンバ変数の値を取得するメソッド

これらメソッドについては、名前の付け方がおおよそ決まっています。

  • メンバ変数の値を設定するメソッドの名前は、英単語のsetを使います。
  • メンバ変数の値を取得するメソッドの名前は、英単語のgetを使います。

値を設定したり取得したりするメソッドの名前では、習慣的にsetやgetを用いることになっています。

自作Javaソースコードにおいては、習慣的に決まっているメソッド名を使うようにしましょう。
他のプログラマーの方が、自作Javaソースコードの処理内容を理解しやすいからです。

メンバ変数の値を設定するsetterメソッド

英単語setは、メンバ変数の値を設定するメソッド名に、よく使います。

例:
メンバ変数名がtextの場合、
メソッド名は、setText( … )になります。

このようなsetから始まるメソッドを、setterメソッドと言います。

setterメソッドは、メンバ変数に値を設定(書き込み)するためのものです。

メソッド名は、「set変数名」という形式になります。
引数として、設定したい値を与える必要があります。

setterメソッドのソースコードの例

例えば、以下のようなPersonクラスがあるとします。

public class Person {
  private String name; // 名前
  private int age; // 年齢

中略

  // nameのsetterメソッド
  public void setName(String name) {
    this.name = name;
  }

  // ageのsetterメソッド
  public void setAge(int age) {
    this.age = age;
  }
}

setName()メソッドは、nameメンバ変数のsetterメソッドです。
setAge()メソッドは、ageメンバ変数のsetterメソッドです。

メンバ変数の値を取得するgetterメソッド

英単語getは、メンバ変数の値を取得するメソッド名に、よく使います。

例:
メンバ変数名がtextの場合、
メソッド名は、getText()になります。

このようなgetから始まるメソッドを、getterメソッドと言います。

getterメソッドは、メンバ変数の値を取得(読み取り)するためのものです。

メソッド名は、「get変数名」という形式になります。

getterメソッドのソースコードの例

例えば、以下のようなPersonクラスがあるとします。

public class Person {
  private String name; // 名前
  private int age; // 年齢

中略

  // nameのgetterメソッド
  public String getName() {
    return this.name;
  }

  // ageのgetterメソッド
  public int getAge() {
    return this.age;
  }
}

getName()メソッドは、nameメンバ変数のgetterメソッドです。
getAge()メソッドは、ageメンバ変数のgetterメソッドです。

Javaプログラミング
Javaプログラミング・イメージ画像

setterメソッドのこと、オブジェクトの内部状態を変更するミューテータメソッド

ミューテータ(mutator)メソッドは、オブジェクトの内部状態を変更するためのメソッドです。
setterメソッドのことです。

ミューテータメソッド(setterメソッド)とは、
オブジェクト指向プログラミングにおいて、オブジェクトの属性や状態を変更するためのメソッドです。

Javaプログラミングにおいて、ミューテータメソッドには以下のような利点があります。

オブジェクトのカプセル化を実現する

ミューテータメソッドは、オブジェクトのカプセル化を実現します。

カプセル化とは、以下の機能を実現することです。

  • オブジェクトの内部データや実装を、隠蔽する。
  • オブジェクトの外部からは、公開されたインターフェースを通じてのみアクセスできるようにする。
  • オブジェクトのデータを、保護する。
    不正な値や矛盾した状態にならないように制御できる。

オブジェクトの抽象化を促進する

ミューテータメソッドは、オブジェクトの抽象化を促進します。

抽象化とは、以下の機能を実現することです。

  • オブジェクトの本質的な特徴や振る舞いを、表現する。
  • オブジェクトに関する、不要な複雑さを省略する。

抽象化することで、オブジェクトの機能や役割を明確にして、再利用性や拡張性を高めることができます。

オブジェクトの多様性や柔軟性を提供する

ミューテータメソッドは、オブジェクトの多様性や柔軟性を提供します。

オブジェクトの多様性とは、同じインターフェースを持つ異なるオブジェクトが存在できることです。

同じインターフェースを持つ、新しいオブジェクトを作成できます。

オブジェクトの柔軟性とは、オブジェクトの属性や状態を動的に変更できることです。

オブジェクトの振る舞いを、プログラム処理の状況に応じて変更できます。

ミューテータメソッドは、カプセル化、抽象化、多様性を実現します

以上のように、ミューテータメソッドは、Javaプログラミングにおいて重要な役割を果たします。

ミューテータメソッドを適切に使用すれば、オブジェクト指向プログラミングの基本原則を実現できます。

  • オブジェクトのカプセル化。
  • オブジェクトの抽象化。
  • オブジェクトの多様性。

以上のような基本原則を実現できます。

ミューテータメソッドのソースコードの例

class Person {
  private String name;
  private int age;

  public Person(String name, int age) {
    setName(name);
    setAge(age);
  }

  public void setName(String name) {
    if (name == null || name.isEmpty()) {
      throw new IllegalArgumentException("名前が空です。");
    }
    this.name = name;
  }

  public void setAge(int age) {
    if (age < 0 || age > 150) {
      throw new IllegalArgumentException("年齢が負の数、または150より大きい数です。");
    }
    this.age = age;
  }

// 省略
}

Personクラスは、以下のメンバ変数を持ちます。

  • 人名を保持するnameメンバ変数。
  • 年齢を保持するageメンバ変数。

Personクラスでは、それぞれのメンバ変数に対応するミューテータメソッドを、定義しています。

これらのミューテータメソッドでは、メンバ変数の値を保護するために、ミューテータメソッドの中で引数の妥当性を検査します。

もしも引数の値が不正な値の場合、例外を通知します。

例えば、引数に以下のような不正な値が設定されている場合、例外を通知します。

  • 引数のnameに、空文字列やnull値が設定されている。
  • 引数のageに、負の数や不自然に大きな数が設定されている。

このようにすることで、ミューテータメソッドは、不正な値がメンバ変数に設定されるのを防ぎます。

getterメソッドのこと、オブジェクトの内部状態を観測するアクセッサメソッド

アクセッサ(accessor)メソッドには、オブジェクトの内部状態に影響を与えず、値だけ返すメソッドがあります。
getterメソッドのことです。

getterメソッドから返された値により、オブジェクトの外部から、オブジェクトの内部状態を観測できます。

なお、アクセッサメソッドは、一般的に以下の二種類に分けられます。

  • setterメソッド
  • getterメソッド

当見出しの「オブジェクトの内部状態を観測するアクセッサメソッド」とは、getterメソッドを意味しています。

メンバ変数の値を取得するだけのアクセッサメソッドのことを、意味します。

オブジェクトのカプセル化を実現するアクセッサメソッド

オブジェクト指向プログラミングにおいて、アクセッサメソッドとは、
オブジェクト内部のメンバ変数(属性やプロパティ)に、外部から読み取りや書き込みを行うメソッドです。

アクセッサメソッドは、カプセル化という概念に基づいています。

カプセル化とは、オブジェクトの内部状態を隠蔽して、外部から直接操作されないようにすることです。

これにより、以下の機能を提供できます。

  1. オブジェクトのデータを保護する。
  2. 不正な値の代入を防ぐ。
  3. オブジェクトの利用者に対して、必要なインターフェースだけを提供する。

1番と3番の機能は、getterメソッドが提供する機能と言えます。
オブジェクトのデータを保護しつつ、オブジェクトのデータを観測できます。

アクセッサメソッドを用意することで、オブジェクトの内部構造や実装を隠すことができます。
これは、オブジェクトの再利用性や保守性を向上させます。

アクセッサメソッドだけを通じてメンバ変数にアクセスすることで、以下の処理を行えます。

  • 値の妥当性や整合性を検査する。
  • 値の変更時に、何らかの処理を行う。

上記二つの処理は、setterメソッドが提供する機能と言えます。

getterメソッドやsetterメソッドというアクセッサメソッドは、Javaプログラミングのようなオブジェクト指向プログラミングでは、重要な要素です。

よって、適切にアクセッサメソッドを作成することが大事です。

アクセッサメソッドを過剰に用意すると、問題が起きます

ただし、アクセッサメソッドを過剰に用意すると、以下の問題点が起きる可能性があります。

  • オブジェクトのカプセル化が崩れる。
  • コード量や処理量が増える。

そのため、アクセッサメソッドは必要最低限だけ用意すべき、と思います。

アクセッサメソッドのソースコードの例

public class Person {
  // フィールド(属性)
  private String name; // 名前
  private int age; // 年齢

  // コンストラクタ(初期化メソッド)
  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  // getterメソッド(フィールドの値を返す)
  public String getName() {
    return name;
  }

  public int getAge() {
    return age;
  }

  // setterメソッド(フィールドの値を設定する)
  public void setName(String name) {
    this.name = name;
  }

  public void setAge(int age) {
    this.age = age;
  }
}

アクセッサメソッドのgetterメソッドは、以下のメソッドです。

  • getName()メソッド
  • getAge()メソッド

アクセッサメソッドのsetterメソッドは、以下のメソッドです。

  • setName()メソッド
  • setAge()メソッド