2015-02-10 3 views
0

У меня есть класс следующим образом:Правильный способ установить даты класса с проверкой

class Date 
{ 
    // Field variables 
    private int day; 
    private int month; 
    private int year; 

    // Default constructor 
    public Date() 
    { 
     year = 2015; 
     day = 0; 
     month = 0; 
    } 

    // Overloaded constructor 
    public Date(int _day, int _month, int _year) 
    { 
     setDay(_day); 
     setMonth(_month); 
     setYear(_year); 
    } 

    // Accessors 
    public int getDay() 
    { 
     return day; 
    } 

    public int getMonth() 
    { 
     return month; 
    } 

    public int getYear() 
    { 
     return year; 
    } 

    // Mutators 
    public void setMonth(int _month) 
    { 
     if (_month > 0 && _month <= 12) 
     { 
      month = _month; 
     } 
    } 

    public void setYear(int _year) 
    { 
     if (_year >= 1700 && _year <= 2015) 
     { 
      year = _year; 
     } 
    } 

    public void setDay(int _day) 
    { 
     if (_day > 0 && _day <= DateTime.DaysInMonth(year, month)) 
     { 
      day = _day; 
     } 
    } 

часть, которая не работает, заключается в проверке мой день внутри метода setDay(). DateTime.DaysInMonth(year, month) (Метод проверяет, сколько дней в конкретный месяц в данном году для учета високосных годов и февраля) вызывает от значения конструктора по умолчанию 0 за несколько месяцев до того, как данные пользователя/приложения пройдут, чтобы присвоить ему что-то между 1 и 12. Я не могу использовать DateTime для проверки всего этого, потому что приложение настроено таким образом, чтобы пользователи могли вводить 0 значений за день или месяц, что в свою очередь не печатает день или месяц в конечном формате.

Одно из предложений заключалось в том, чтобы сделать мои сеттеры конфиденциальными и сделать один общедоступный метод setDate для пользователей, который позволит им устанавливать день, месяц и год в любом порядке ... Но я не могу точно это реализовать :

public void setDate(int _day, int _month, int _year) 
{ 
    day = _day; 
    month = _month; 
    year = _year; 
} 

потому что это просто пропускает мою проверку в моих частных сеттерах.

Я могу честно найти много способов, чтобы получить эту работу с не convetional методами, но я просто нужна помощь очистки все это, чтобы соответствовать правильной конструкции класса конвенции ..

+3

Измените порядок своего конструктора, чтобы в первую очередь установить месяц и год. Если вы разрешаете месяц/год быть нулевым, то вам нужно учитывать это в вашей процедуре 'setDay'. – entropic

ответ

1

Вы звоните setDay (в вашем Overloaded constructor) перед вызовом setMonth и setYear. Поскольку вам нужен год и месяц для использования DayaInMonth, вам нужно сначала вызвать эти сеттеры в своем конструкторе.

+0

Спасибо! Я не могу поверить, что я смотрел что-то подобное, но это была моя проблема. –

0

Я публикую это, потому что я выяснил «предложение», которое я упомянул в своем первоначальном вопросе, из-за других замечательных ответов, которые я получил здесь. На всякий случай, если кто-то захочет сделать это так.

Сохраняя конструкторы и все остальное в том же порядке, если я публично сеттера для SETDATE() как так:

public void setDate(int _day, int _month, int _year) 
{ 
    setYear(_year); 
    setMonth(_month); 
    setDay(_day); 
} 

я могу изменить оригинальные сеттеры для частных и называть их в любом порядке указываю (потому что и , и setMonth() необходимо вызвать до setDay()) через вызовы методов в общедоступном методе, а не просто присваивать значения непосредственно переменным поля.