Menu
Coddy logo textTech

GetterとSetterメソッド

CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 11/87。

ゲッターとセッターは、プライベートフィールドへの制御されたアクセスを提供するメソッドです。ゲッターはフィールドの値を取得し、セッターはそれを変更します。

命名規則は標準的なパターンに従います:接頭辞 get または set の後に、最初の文字を大文字にしたフィールド名が続きます。

public class Product {
    private String name;
    private double price;
    
    // nameのゲッター
    public String getName() {
        return name;
    }
    
    // nameのセッター
    public void setName(String name) {
        this.name = name;
    }
    
    // priceのゲッター
    public double getPrice() {
        return price;
    }
    
    // バリデーション付きのセッター
    public void setPrice(double price) {
        if (price >= 0) {
            this.price = price;
        }
    }
}

セッターの真の力は、バリデーション(検証)ロジックを追加できる点にあります。上記の例では、setPrice は非負の値のみを受け入れるため、オブジェクトを無効なデータから保護できます。

boolean フィールドの場合、ゲッターは通常、get の代わりに is プレフィックスを使用します:

private boolean active;

public boolean isActive() {
    return active;
}

ゲッターのみを提供することで読み取り専用フィールドを、セッターのみを提供することで書き込み専用フィールドを作成することもできます。これにより、外部コードがオブジェクトのデータとどのようにやり取りするかをきめ細かく制御できるようになります。

challenge icon

チャレンジ

簡単

バリデーションロジックを備えたゲッターとセッターの力を示す Temperature コンバーターを作成しましょう。

コードを整理するために、2つのファイルを作成します。

  • Temperature.java: 摂氏(Celsius)で温度値を保存する Temperature クラスを定義します。このクラスには以下を含める必要があります。
    • プライベートな celsius フィールド (double)
    • 温度が物理的に可能かどうかを追跡するプライベートな valid フィールド (boolean)
    • celsius の値を返すゲッター getCelsius()
    • 絶対零度(-273.15)以上の値のみを受け入れるセッター setCelsius()。値が有効な場合は valid を true に設定し、そうでない場合は celsius を変更せずに valid を false に設定します
    • boolean フィールド用のゲッター isValid()(注意:boolean のゲッターは is プレフィックスを使用します)
    • 次の公式を使用して、温度を華氏(Fahrenheit)に変換して返すゲッター getFahrenheit(): (celsius * 9/5) + 32
  • Main.java: Temperature オブジェクトを作成し、入力として摂氏の値を読み取り、セッターを使用してそれを設定します。その後、温度が有効かどうかとその華氏換算値を出力します。出力は次の2行でフォーマットしてください。
    • "Valid: " に続けて true または false
    • "Fahrenheit: " に続けて X.X(小数点以下1桁を表示)

入力として、摂氏の温度を表す1つの double 値を受け取ります。

華氏の出力を小数点以下1桁にフォーマットするには、String.format("%.1f", value) を使用できます。

チートシート

ゲッター(Getter)とセッター(Setter)は、プライベートフィールドへの制御されたアクセスを提供するメソッドです。ゲッターはフィールドの値を取得し、セッターはそれを変更します。

命名規則は標準的なパターンに従います。getまたはsetという接頭辞の後に、最初の文字を大文字にしたフィールド名を続けます。

public class Product {
    private String name;
    private double price;
    
    // nameのゲッター
    public String getName() {
        return name;
    }
    
    // nameのセッター
    public void setName(String name) {
        this.name = name;
    }
    
    // priceのゲッター
    public double getPrice() {
        return price;
    }
    
    // バリデーション付きのセッター
    public void setPrice(double price) {
        if (price >= 0) {
            this.price = price;
        }
    }
}

セッターには、無効なデータからオブジェクトを保護するためのバリデーションロジックを含めることができます。上記の例では、setPriceは非負の値のみを受け入れます。

booleanフィールドの場合、ゲッターはgetの代わりにisという接頭辞を使用します。

private boolean active;

public boolean isActive() {
    return active;
}

ゲッターのみを提供することで読み取り専用フィールドを作成したり、セッターのみを提供することで書き込み専用フィールドを作成したりできます。

自分で試してみよう

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double celsiusInput = scanner.nextDouble();
        
        // TODO: Temperature オブジェクトを作成する
        
        // TODO: セッターを使用して celsius の値を設定する
        
        // TODO: 温度が有効かどうかを出力する (形式: "Valid: true" または "Valid: false")
        
        // TODO: 華氏 (Fahrenheit) に換算した値を出力する (形式: "Fahrenheit: X.X")
        // ヒント: 小数点第1位まで表示するには String.format("%.1f", value) を使用します
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン