解答例 - j2.lesson05.AlarmClock18

package j2.lesson05;

/**
 * 課題1803 - 解答例.
 * アラームつきの時計を表すクラス.
 @author arakawa
 @version $Id: AlarmClock18_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
 */
public class AlarmClock18 extends Clock {

    /** アラームが設定されているかどうか. */
    private boolean alarm;

    /** アラームを鳴らすまでの残り秒数. */
    private int alarmRest;

    /**
     * 初期時刻を指定してインスタンスを生成する。
     * この状態ではアラームは解除されている。
     @param hour 時
     @param minute 分
     @param second 秒
     */
    public AlarmClock18(int hour, int minute, int second) {
        super(hour, minute, second);
        this.alarmRest = 0;
        this.alarm = false;
    }

    /**
     * アラームをセットする。
     * すでにアラームがセットされていた場合、それは解除される。
     @param hour アラームを鳴らす時
     @param minute アラームを鳴らす分
     @param second アラームを鳴らす秒
     */
    public void setAlarmFor(int hour, int minute, int second) {
        int alarmTime = hour * 3600 + minute * 60 + second;

        // 現在時刻よりも手前にあれば、明日に鳴らす
        if (alarmTime < getTimeAsSec()) {
            this.alarmRest = alarmTime - getTimeAsSec() 86400;
        }
        else {
            this.alarmRest = alarmTime - getTimeAsSec();
        }
        this.alarm = true;
        
        // 必要ならばすぐにアラーム
        alarm();
    }
    
    /**
     * n 秒だけ進める。
     @param n 進める秒数
     */
    public void tick(int n) {
        // 親クラスの時計を進める
        super.tick(n);
        
        // アラームの処理
        this.alarmRest -= n;
        alarm();
    }

    /**
     * 必要ならばアラームを鳴らす。
     */
    private void alarm() {
        if (this.alarm && this.alarmRest <= 0) {
            System.out.println("アラーム");
            this.alarm = false;
        }
    }
}