Если заявление не работает правильно для дат - PullRequest
0 голосов
/ 23 февраля 2011

Я написал оператор if, который должен записывать различный вывод в зависимости от данных. Он работает, если int y = 2000, m = 5, d = 06;, но не выводит правильное значение, когда int y = 2889, m = 44, d = 16;.

Это мой код. Может кто-нибудь, пожалуйста, помогите мне понять, что не так.

public class Date1 {

    private int year = 1; // any year
    private int month = 1; // 1-12
    private int day = 1; // 1-31 based on month

    //method to set the year
    public void setYear(int y) {
        if (y <= 0) {
            System.out.println("That is too early");
            year = 1;
        }

        if (y > 2011) {
            System.out.println("That year hasn't happened yet!");
            y = 2011;
        } else {
            year = y;
        }
    }

    public int setMonth(int theMonth) {
        if ( theMonth > 0 && theMonth <= 12 ) { // validate month
            return theMonth;
        } else { // month is invalid 
            System.out.printf("Invalid month (%d) set to 1.", theMonth);
            return 1; // maintain object in consistent state
        } // end else   
    }

    public int setDay( int theDay) {
        int[] daysPerMonth = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

        // check if day in range for month
        if ( theDay > 0 && theDay <= daysPerMonth[ month ] ) {
            return theDay;
        }

        // check for leap year
        if ( month == 2 && theDay == 29 && ( year % 400 == 0 || ( year % 4 == 0 && year % 100 != 0 ) ) ) {
            return theDay;
        }

        System.out.printf( "Invalid day (%d) set to 1.", theDay );
        return 1;  // maintain object in consistent state 
    }

    //method to return the year
    public int getYear() {
        return year; 
    }

    //method to return the month
    public int getMonth(){
        return month; 
    }

    //method to return the day 
    public int getDay(){
        return day; 
    }

    // return a String of the form year/month/day
    public String toUniversalStringTime() { 
        return String.format( "The date using a default constructor %d/%d/%d \n", getYear(), getMonth(), getDay() ); 
    } // end toUniversalStringTime
}

public class Date1Test {

    public static void main(String[] args) {        
        int y = 2000, m = 5, d = 06;        

        Date1 d1 = new Date1(); //create a new object

        System.out.println(d1.toUniversalStringTime()); //call toUniversalStringTime()

        System.out.printf("The date I created is %d/%d/%d \n", y , m , d);  
    }
}

Ответы [ 3 ]

4 голосов
/ 23 февраля 2011

Я не вижу нигде в вашем коде, где вы вызываете методы setDay, setMonth или setYear, поэтому я ожидаю, что вызов toUniversalStringTime всегда будет печатать

"The date using a default constructor 111 \n"

Затем после этого вызова вы снова печатаете его вручную, используя значения для y, m и d

"The date I created is 200056 \n"

Вам нужно вызвать методы set для объекта d1 после создания или передать параметры конструктору для их установки, например,

d1.setYear(y);
d1.setMonth(m);
d1.setDay(d);

но, пожалуйста, обратите внимание на некоторые другие комментарии, которые были сделаны в отношении рефакторинга вашего кода, потому что, как уже упоминалось, каждый из ваших методов установки имеет фундаментальные недостатки, которые необходимо исправить в первую очередь.

Другие общие примечания к вашему коду:

В вашем методе setYear вы используете значение y, чтобы обновить переменную года объекта, но во втором, если:

if (y > 2011) {
    System.out.println("That year hasn't happened yet!");
    y = 2011;
}

вы на самом деле устанавливаете y на 2011, а не year, так что это не будет иметь никакого эффекта.

По какой-то причине в вашем методе setMonth вы на самом деле не устанавливаете месяц, а просто проверяете значение, которое передается, т. Е. Если значение не между 1 и 12, вы возвращаете 1. Таким образом, код не сопоставьте название метода, и вы должны изменить один или другой.

Ваш метод setDay такой же, как setMonth, в том смысле, что он фактически не устанавливает день, а только проверяет его. Но что еще хуже, это то, что вызов метода setDay сильно зависит от уже заданного месяца и года, поскольку вы используете переменные month и year, чтобы определить, действительно ли день действителен. Это означает, что setDay должен вызываться только после setMonth и setYear, в противном случае вы всегда по умолчанию будете проверять против января 0001 (поскольку месяц и год по умолчанию установлены в 1).

2 голосов
/ 23 февраля 2011

Ваш установщик года неверен:

//method to set the year
public void setYear(int y){

   if (y <= 0)
   {
     System.out.println("That is too early");
     year = 1;
   }

   if (y > 2011)
   {
     System.out.println("That year hasn't happened yet!");
     y = 2011;
   }
   else //<-- problem, makes the next stamtement only be executed if y <= 2011
     year = y;
 }

Я полагаю, что последнее утверждение else является вашей проблемой, оно означает, что год обновляется только в том случае, если он до 2011 года. Но я полагаю, что из-зазаявление y = 2011 должно быть ограничено до 2011 года - поэтому вам нужно удалить else

или написать его простым способом:

public void setYear(int year) {
   this.year = Math.max(1,Math.min(2011,year));
}
1 голос
/ 23 февраля 2011

Ваши методы установки должны фактически устанавливать поле и ничего не возвращать (void).setYear - это нормально, но два ваших метода setter, setMonth и setDay, не устанавливают никаких полей класса и возвращают значение int, которое не имеет смысла.Вопрос для вас в том, какое поле должно изменить setMonth, а какое поле должно изменить setDay?После того, как вы ответите на этот вопрос, вы можете изменить свои методы, чтобы они работали лучше.Пожалуйста, прокомментируйте, если что-то из этого не имеет никакого смысла.

Например, ваш сеттер выглядит так:

// assuming you have an int field foo that should be > 0 and <= 100
public int setFoo(int foo) {
  if (foo < 0) {
     return 0;
  } else if (foo > 100) {
    return 100;
  } else {
    return foo;
  }
}

Когда вместо этого должно быть больше похоже:

public void setFoo(int foo) {
  if (foo < 0) {
     this.foo = 0;
  } else if (foo > 100) {
    this.foo = 100;
  } else {
    this.foo = foo;
  }
}

видите разницу?

...