Возврат логического значения и использование его в других методах и объектах - PullRequest
0 голосов
/ 22 декабря 2011

Я должен создать часы, отображающие военное и обычное время в двух разных классах и время, объявленное как объекты. Это сделано, но теперь мне нужно расширить класс clock в AMPMclock, который имеет метод setAMPM(boolean yes)в этом.Если setAMPM(true) будет отображать военное время, а если оно ложно, то будет отображаться Нормальное время.Я создаю setAMPM метод

class AMPMclock extends clock
{
    boolean setAMPM(boolean yes)
    { 
        return yes;
    }  
}

class clock
{
    private int hours;
    private int minutes;
    private int seconds;
private boolean yes;

    setMin....

    setHour...

    setSec....

    tick() ///moves the clock 1sec


    public String toString()
    {

        if(yes) return String.format("%d:%02d:%02d %s", (hours == 12 || hours == 0)?12 : hours%12, minutes, seconds, (hours < 12)? "AM" : "PM");
        else return String.format("%02d:%02d:%02d",hours,minutes,seconds);
    //else 
    }

}


MAIN

AMPMclock clockObject = new AMPMclock();

clockObject.setHour(16);
clockObject.setMin(28);
clockObject.setSec(58);



    System.out.println(clockObject.toString());
    clockObject.tick();
    clockObject.setAMPM(false);
    System.out.println(clockObject.toString());

    clockObject.tick();
    clockObject.setAMPM(true);
    System.out.println(clockObject.toString());
    clockObject.tick();
    System.out.println(clockObject.toString());

Однако, когда я использую clockObject.setAMPM(true) илиclockObject.setAMPM(false) логическое значение yes не изменится, поэтому я могу использовать его в другом методе.Это всегда остается прежним ... Любая помощь?Tnx

Ответы [ 4 ]

3 голосов
/ 22 декабря 2011

Идея сеттера заключается в инкапсуляции частной переменной экземпляра.Вы просто возвращаете параметр обратно без изменения внутреннего состояния класса, поэтому ничто не «прилипает» к вашему коду.

class Clock {

     private boolean useAMPM;

     public void setAMPM(boolean useAMPM) {
         this.useAMPM = useAMPM;
     }

     public boolean isAMPM() {
         return this.useAMPM;
     }
}
2 голосов
/ 22 декабря 2011

Если вы сохраните настройку, например, в переменной экземпляра ampm, вам потребуется что-то вроде:

boolean ampm = true;

boolean setAMPM(boolean yes)
{
    ampm = yes;
    return yes;
}  
0 голосов
/ 22 декабря 2011

вам, вероятно, нужно сохранить это в переменной-члене ...

    private boolean useAMPM = false;
    public boolean setAMPM (final boolean wantAMPM) {
          useAMPM = wantAMPM;
          return useAMPM;
    }
    public void draw () {
            … 
          if (useAMPM) { /* … */ } else { /* … */ }
    }

Переменные в лямбда-списке метода (те, которые вы указываете при определении метода, например wantAMPM / yes)присваиваются при вызове функции и уничтожаются при ее возврате.(Хорошая привычка объявлять их все final, также по разным причинам.) Фактически, вы также можете создавать автоматические переменные внутри (почти) любой пары { braces } в программе Java, который также будет уничтожен, когда вы достигнете конца } блока.

Member переменные (свойства) хранятся в течение всего времени существования экземпляра объекта, в котором онинайденный.Поэтому, когда, например, вы говорите Clock clockInstance = new Clock ();, тогда будет создан clock.useAMPM и будет существовать до тех пор, пока clockInstance не будет уничтожен.

0 голосов
/ 22 декабря 2011

Может быть, вам нужно следовать соглашениям Java-бинов?

Это то, к чему вы стремитесь?

public class AMPMClock {

  private boolean isAMPM;

  public void setAMPM(boolean ampmFlag){
    this.isAMPM = ampmFlag;
  }
  public boolean isAMPM(){
   return this.isAMPM;
  }

}
...