Java

クラスとオブジェクト

関係するデータと操作をまとめ、不正な状態を防げる設計を学びます。

Java入門の講座一覧

01

クラスを使う場面

常に一緒に扱うデータと操作がある場合はクラスにまとめると関係が明確になります。

クラスにする目安
  • 一緒に扱う複数の値がある
  • 値へ行う操作が複数ある
  • 外部から勝手に変更されると困る
02

フィールド、コンストラクタ、メソッド

Product.javaJAVA
public class Product {
    private final String name;
    private final int price;
    public Product(String name, int price) {
        this.name = name;
        this.price = price;
    }
    public String label() { return name + "(" + price + "円)"; }
}
実行結果OUTPUT
Java入門(2000円)
03

不正な状態を防ぐ

コンストラクタで価格を検証すれば、負の価格を持つ商品を作れません。

検証を追加JAVA
public Product(String name, int price) {
    if (name == null || name.isBlank()) {
        throw new IllegalArgumentException("商品名は必須です");
    }
    if (price < 0) {
        throw new IllegalArgumentException("価格は0以上です");
    }
    this.name = name;
    this.price = price;
}
検証結果OUTPUT
IllegalArgumentException: 価格は0以上です
04

データ中心ならrecord

recordは値を保持する型を簡潔に定義できます。コンパクトコンストラクタで入力も検証できます。

User.javaJAVA
public record User(String name, int age) {
    public User {
        if (age < 0) {
            throw new IllegalArgumentException("年齢は0以上です");
        }
    }
}

System.out.println(new User("Mity", 20));
実行結果OUTPUT
User[name=Mity, age=20]
05

インターフェースと委譲

インターフェースで契約を表し、具体的な通知処理を委譲すると実装を切り替えやすくなります。

通知の切替JAVA
interface Notifier {
    void send(String message);
}

class ConsoleNotifier implements Notifier {
    public void send(String message) {
        System.out.println("通知: " + message);
    }
}

class OrderService {
    private final Notifier notifier;
    OrderService(Notifier notifier) { this.notifier = notifier; }
    void complete() { notifier.send("注文が完了しました"); }
}
実行結果OUTPUT
通知: 注文が完了しました
PRACTICE

ミニ課題:銀行口座

口座名義と残高を持つBankAccountを作り、預け入れと引き出しをメソッドにします。0以下の金額や残高を超える引き出しは例外にしてください。

確認する順番 初期残高0、1000円を預ける、400円を引き出す、残高600円、700円の引き出しは失敗、という流れをテストします。