クラスを使う場面
常に一緒に扱うデータと操作がある場合はクラスにまとめると関係が明確になります。
クラスにする目安
- 一緒に扱う複数の値がある
- 値へ行う操作が複数ある
- 外部から勝手に変更されると困る
フィールド、コンストラクタ、メソッド
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円)不正な状態を防ぐ
コンストラクタで価格を検証すれば、負の価格を持つ商品を作れません。
検証を追加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以上ですデータ中心なら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]インターフェースと委譲
インターフェースで契約を表し、具体的な通知処理を委譲すると実装を切り替えやすくなります。
通知の切替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
通知: 注文が完了しましたミニ課題:銀行口座
口座名義と残高を持つBankAccountを作り、預け入れと引き出しをメソッドにします。0以下の金額や残高を超える引き出しは例外にしてください。
確認する順番 初期残高0、1000円を預ける、400円を引き出す、残高600円、700円の引き出しは失敗、という流れをテストします。