S SmartDocs
Serie: Angelia java 38 líneas · Actualizado 2026-09-27

LoggingSavingsAccount.java

Angelia/Java/Week_6_7/code/03_inheritance_lsp/LoggingSavingsAccount.java

import java.util.ArrayList;
import java.util.List;

/**
 * 會記錄操作的儲蓄帳戶:覆寫 withdraw,但把「真正的提款邏輯」交給 super.withdraw。
 *
 * 這是「擴充而非取代」父類別行為的典型寫法。
 * 它完全遵守 SavingsAccount 的契約(結果一模一樣,只是多記一筆 log),
 * 所以是 LSP 合規的子型別。
 *
 * final:宣告這個類別不能再被繼承。
 */
public final class LoggingSavingsAccount extends SavingsAccount {

    private final List<String> log = new ArrayList<>();

    @Override
    public boolean withdraw(int amount) {
        boolean ok = super.withdraw(amount);          // 先做父類別的事
        if (ok) {
            this.log.add("withdraw " + amount);       // 再加上自己的事
        } else {
            this.log.add("withdraw " + amount + " FAILED");
        }
        return ok;
    }

    @Override
    public void deposit(int amount) {
        super.deposit(amount);
        this.log.add("deposit " + amount);
    }

    /** 回傳「防禦性複製」:外界拿到的是副本,改不到我們內部的 log。 */
    public List<String> getLog() {
        return new ArrayList<>(this.log);
    }
}

Artículos relacionados