通过验证设置日期 class 的正确方法

Proper way to set up Date class with validation

我有一个class如下:

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)(该方法检查给定年份的特定月份有多少天以计算闰年和二月)在 users/application 数据通过之前的月份从默认构造函数值 0 调用给它分配 1 到 12 之间的值。 我无法使用 DateTime 来验证整个事情,因为应用程序已设置为用户可以为日或月输入 0 值,这反过来不会以最终格式打印出日或月。

一个建议是将我的 setter 设为私有,并为用户制作一个 public setDate 方法,允许他们以任何顺序设置日、月和年...但我不能似乎正确实施:

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

因为这只是跳过了我在我的私有设置器中的验证。

老实说,我可以找到很多方法让它与非传统方法一起工作,但我只需要帮助清理它以适应适当的 class 设计约定..

您在调用 setMonth 和 setYear 之前调用了 setDay(在您的重载构造函数中)。由于您需要年份和月份才能使用 DayaInMonth,因此您需要先在构造函数中调用这些设置器。

我发布这个是因为我想出了我在原来的问题中提到的 "suggestion",因为我在这里收到了其他很好的答案。以防万一有人想这样做。

保持构造函数和其他所有内容的顺序相同,如果我像这样为 setDate() 创建 public setter:

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

我可以将原来的 setters 更改为私有的,并以我指定的任何顺序调用它们(因为 setYear()setMonth() 都需要在 setDay() 之前调用)通过 public 方法中的方法调用,而不是直接为字段变量赋值。