2016-12-05 5 views
0

Я новичок в Java, и все это функция param/object method (очень отличается от PowerShell) Я хочу написать простую программу, которая представляет объект Date и перед каждым set, он проверяет, действительна ли дата. Если он недействителен, установите значение по умолчанию.Проверить дату перед изменением в двух разных функциях

У меня возникли проблемы с setDay, setMonth и setYear (только для примера setYear). setYear, работающий с одним параметром (год) и isValidDate, работающий с 3 параметрами (день, месяц, год). Как я могу позвонить isValidDate в функции набора?

Я не могу изменить main, но только public/private функции вызовов.

Набор функций:

public void setYear(int yearToSet){ 
    _year = isValidDate(yearToSet); //??????? PROBLEM ??????? tried:_year = isValidDate(yearToSet) ? yearToSet : DEF_YEAR; 
    _year = yearToSet; 
} 

Программа:

public class Date { 
// Private vars 
private int _day; 
private int _month; 
private int _year; 
// Private finals 
private final int MIN_DAY = 1; 
private final int MIN_MONTH = 1; 
private final int MAX_MONTH = 12; 
private final int MIN_YEAR = 1000; 
private final int MAX_YEAR = 9999; 
private final int DEF_DAY = 1; 
private final int DEF_MONTH = 1; 
private final int DEF_YEAR = 2000; 

// Constructors: 
/** 
* Creates a new Date object if the date is valid, otherwise creates the date 1/1/2000 
* @param day the day in the month(1-31) 
* @param month the month in the year(1-12) 
* @param year the year (4 digits) 
*/ 
public Date(int day, int month, int year) { 
    if (isValidDate(day,month,year)) { 
     _day = day; 
     _month = month; 
     _year = year; 
    } 
    else 
     defDate(); 
} 

// Private methods 
/** 
* Set date to default - 1/1/2000 
*/ 
private void defDate(){ 
    setDay(DEF_DAY); 
    setMonth(DEF_MONTH); 
    setYear(DEF_YEAR); 
} 

/** 
* Validate day by month 
*/ 
private int numDaysInMonth(int month, boolean isLeapYear) { 
    switch (month) { 
     case 1: 
     case 3: 
     case 5: 
     case 7: 
     case 8: 
     case 10: 
     case 12: 
     return 31; 
     case 4: 
     case 6: 
     case 9: 
     case 11: 
     return 30; 
     case 2: 
     if (isLeapYear) { 
      return 29; 
     } else { 
      return 28; 
     } 
     default: 
     return 0; 
    } 
} 

/** 
* Leap year check 
*/ 
private boolean isLeapYear(int year) { 
    return (((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0)); 
} 

/** 
* Date validate 
*/ 
private boolean isValidDate(int day, int month, int year) { 
    return (month >= MIN_MONTH && month <= MAX_MONTH) && 
    (day >= MIN_DAY && day <= numDaysInMonth(month, isLeapYear(year))) && (year >= MIN_YEAR && year <= MAX_YEAR); 
} 

/** 
* Sets the year (only if date remains valid) 
* @param yearToSet - the year value to be set 
*/ 
public void setYear(int yearToSet){ 
    _year = isValidDate(yearToSet); //??????? PROBLEM ??????? 
    _year = yearToSet; 
} 
+2

nooooo, несколько классов уже могут это сделать ... зачем пытаться изобретать велосипед? –

+0

Я знаю, это проект для учебы. Мы не можем использовать эти классы. – igor

ответ

2

isValidDate возвращает логическое значение и _year является INT, так что вы не можете написать:

_year = isValidDate(yearToSet) 

Вы можете написать:

if (isValidDate(_day,_month,yearToSet) { 
_year = yearToSet; 
} else { 
_year = DEF_YEAR; 
} 

или в одной строке:

_year = isValidDate(_day,_month,yearToSet) ? yearToSet : DEF_YEAR; 

Вы сделали две ошибки: не

  • isValidDate 3 параметра (это то, что вы определяете), можно назвать лишь один
  • isValidDate возвращает boolean, а _year - int, а в Java вы не можете поместить логическое значение в int.
+0

Пробовал это. Возникает ошибка: 'метод isValidDate в классе Date не может применяться к заданным типам: required int, int, int; fount: int; .... ' – igor

+0

@igor В коде вашего Вопроса вы объявляете метод' isValidDate' как принимающий три аргумента (день, месяц, год), а внутри метода 'setYear' вы передаете только один аргумент (год) , Ответ здесь Тьерри следовал за вашим руководством, но код вашего вопроса был неправильным в количестве аргументов. Ваша строка, которую вы отметили '// ??????? ПРОБЛЕМА "действительно является проблемой, передавая один аргумент, когда требуются три. Вы должны были включить * точное сообщение об ошибке в свой вопрос. –

+0

Я отредактировал свой ответ – Thierry

Смежные вопросы