我有一个课程如下:
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)
(该方法检查特定月份中特定月份的天数以计算闰年和2月)在用户/应用程序数据通过分配之前,从默认构造函数值0调用数月它介于1到12之间。
我无法使用DateTime来验证整个事情,因为应用程序已设置好,因此用户可以输入0或0天的值,而这些值又不会以最终格式打印出一天或一个月。
一个建议是让我的setter私有,并为用户创建一个公共setDate方法,允许他们以任何顺序设置日,月和年...但我似乎无法实现正确地:
public void setDate(int _day, int _month, int _year)
{
day = _day;
month = _month;
year = _year;
}
因为这只会在我的私人制定者中跳过我的验证。
我可以诚实地找到很多方法来使用非对流方法,但我只是需要帮助清理它以适应适当的类设计惯例。
答案 0 :(得分:1)
在调用setMonth和setYear之前,您正在调用setDay(在重载的构造函数中)。由于您需要使用年份和月份来使用DayaInMonth,因此您需要先在构造函数中调用这些setter。
答案 1 :(得分:0)
我发布这个是因为我想出了&#34;建议&#34;我在原来的问题中提到过,由于我在这里得到了其他很好的答案。以防万一有人想这样做。
保持构造函数和其他所有内容的顺序相同,如果我像这样为setDate()创建一个公共setter:
public void setDate(int _day, int _month, int _year)
{
setYear(_year);
setMonth(_month);
setDay(_day);
}
我可以将原始setter更改为private并按我指定的任何顺序调用它们(因为setYear()
和setMonth()
都需要在setDay()
之前调用)通过public方法中的方法调用,而不是直接为字段变量赋值。