-1

これは宿題です。

アラーム付きの Java 12 時間時計を作成しようとしています。1週間の絶え間ない作業の後、ようやく実行できるようになりましたが、アラームを設定すると、設定した時間の2〜3分前に鳴ります. また、スヌーズ (2 分間スヌーズすることになっています) を押すと、次の分にすぐにオフになります。全部で 10 個のクラスがありますが、関連するものTimeTimeManager. 私はJavaを始めたばかりで、苦労しています。これがばかげた質問であれば申し訳ありません。

Time:

public class Time {
private int hour;
private int minute;

public Time(int initHour, int initMinute) {
    if (1 <= hour && hour <= 12) {
        hour = initHour;
    }
    else if (hour == 0) {
        hour = 12;
    }
    if (0 <= minute && minute <= 59 ) {
        minute = initMinute;
    }
}

public void addOneMinute() {
    minute++;
    if (minute == 59) {
        incrementHour();
        minute = 0;
    }
}

public void incrementHour() {
    hour++;
    if (hour > 12) {
        hour = 1;
    }
}

public void incrementMinute() {
    minute++; 
    if (minute == 59) {
        minute = 0;
    }
}

public int getHour() {
    if (hour >= 1 && hour <= 12) {
    }
    return hour;
}

public int getMinute() {
    if (minute >=0 && minute <= 59) {
    }
    return minute;
}

public boolean equals(Time time) {
    if (hour == hour && minute == minute) {     
        return true;
    }
    else {
        return false;
    }
}
}

TimeManager:

public class TimeManager {
private static final int SNOOZE_DURATION_IN_MINUTES = 2;
private Time currentTime;
private Time alarmTime;
private Time snoozeTime;
private Display     display;
private ModeManager modeMgr;
private Alarm       alarm;

public TimeManager() {
    currentTime = new Time(12,0);
    alarmTime = new Time(12,0);
    snoozeTime = new Time(12,0);
}

public void setDisplay(Display newDisplay) {
    display = newDisplay;
    showCurrentTime();
}

public void setModeManager(ModeManager newModeMgr) {
    modeMgr = newModeMgr;
}

public void setAlarm(Alarm newAlarm) {
    alarm = newAlarm;
}

    public void incrementCurrentMinute() {
    currentTime.addOneMinute();
    Mode mode = modeMgr.getMode();
    if (mode == mode.ALARM_ON || mode == mode.ALARM_OFF || mode == mode.SET_TIME) {
        updateDisplay();
    }
    if (mode == mode.ALARM_ON) {
        if (currentTime.equals(alarmTime) || currentTime.equals(snoozeTime)) {
        soundAlarmIfNecessary();
        }
    }
}

public void incrementCurrentHour() {
    currentTime.incrementHour();
    Mode mode = modeMgr.getMode();
    if (mode == mode.ALARM_ON || mode == mode.ALARM_OFF || mode == mode.SET_TIME) {
        updateDisplay();
    }
    if (mode == mode.ALARM_ON) {
        if (currentTime.equals(alarmTime) || currentTime.equals(snoozeTime)) {
        soundAlarmIfNecessary();
        }
    }
}

public void incrementAlarmMinute() {
    alarmTime.incrementMinute();
    Mode mode = modeMgr.getMode();
    if (mode == mode.SET_ALARM) {
        updateDisplay();
    }
    if (mode == mode.ALARM_ON) {
        if (currentTime.equals(alarmTime)) {
            soundAlarmIfNecessary();
        }
    }
}

public void incrementAlarmHour() {
    alarmTime.incrementHour();
    Mode mode = modeMgr.getMode();
    if (mode == mode.SET_ALARM) {
        updateDisplay();
    }
    if (mode == mode.ALARM_ON) {
        if (currentTime.equals(alarmTime)) {
            soundAlarmIfNecessary();
        }
    }
}

public void snooze() {
    while (alarm.isOn()) {
        alarm.off();
        int hour = currentTime.getHour();
        int minute = currentTime.getMinute();
        minute += SNOOZE_DURATION_IN_MINUTES;
            if (minute > 59) {
                minute -= 60;
                ++hour;
            }
        snoozeTime = new Time(hour, minute);
        }
}

public void showCurrentTime() {
    display.showHour(currentTime.getHour());
    display.showMinute(currentTime.getMinute());
}

public void showAlarmTime() {
    display.showHour(alarmTime.getHour());
    display.showMinute(alarmTime.getMinute());
}

private void updateDisplay() {
    Mode mode = modeMgr.getMode();
    if (mode == mode.SET_TIME || mode == mode.ALARM_ON || mode == mode.ALARM_OFF) {
        showCurrentTime();
    }
    else {
        showAlarmTime();
    }
}

private void soundAlarmIfNecessary() {
    Mode mode = modeMgr.getMode();
    if (mode == mode.ALARM_ON && currentTime.equals(alarmTime) || currentTime.equals(snoozeTime)) {
        alarm.on();
    }
}
}
4

1 に答える 1

2

とりわけ、Time.equals()メソッドに非常に重大なバグがあります。

public boolean equals(Time time) {

    if (hour == hour && minute == minute) {     
        return true;
        }
    else {
        return false;
        }
    }
}

式は、インスタンス変数をそれ自体hour == hourと比較しています。これは常に です。これは明らかにあなたが望むものではありません。代わりに、次のように、指定された引数のフィールドと比較したいと考えています。hourtruehourtime

    if (hour == time.getHour() && minute == time.getMinute() ) {     
于 2013-04-11T21:40:14.500 に答える