我有下一个代码,此代码必须验证日期,但我必须遵循一些要求:
首先,我必须创建一个名为MyDate的类,该类包含三个属性:日,月和年。我必须使用没有参数的构造函数初始化这些属性。
然后我必须定义三个方法:setDay(),setMonth()和setYear(),在这个方法中我必须验证日期是否正确。在main方法()中我必须调用set方法,但问题是我不知道如何用构造函数初始化属性,同时我已经在main中初始化它们当我调用它时设定方法
class MyDate{
final int JANUARY = 1;
final int FEBRUARY = 2;
final int MARCH = 3;
final int APRIL = 4;
final int MAY = 5;
final int JUNE = 6;
final int JULY = 7;
final int AUGUST = 8;
final int SEPTEMBER = 9;
final int OCTOBER = 10;
final int NOVEMBER = 11;
final int DECEMBER = 12;
private int day;
private int month;
private int year;
public MyDate(){
//here is the problem;
}
public int getDay()
{
return day;
}
public int getMonth()
{
return month;
}
public int getYear()
{
return year;
}
public boolean setDay(int day)
{
//is not finished
}
public boolean setMonth(int month)
{
//is not finished
}
public boolean setYear(int year)
{
//is not finished
}
}
public class E{
public static void main(String[] args){
MyDate date = new MyDate();
date.setDay(31);
date.setMonth(11);
date.setYear(2014);
System.out.println("DAY: "+date.getDay());
System.out.println("MONTH: "+date.getMonth());
System.out.println("YEAR: "+date.getYear());
}
}
答案 0 :(得分:0)
我不确定我是否完全理解你想要的东西,特别是你想在没有参数的构造函数中设置变量的部分。以下解决方案怎么样?您也可以创建默认的构造函数并调用this(1, 1, 2015)
。
class MyDate {
public MyDate() {
this(1, 1, 2015);
}
public MyDate(int day, int month, int year){
setDay(day);
setMonth(month);
setYear(year);
}
public void setDay(int day) {
if (isValid(day, month, year))
this.day = day;
else
throw new RuntimeException("Day is not valid.");
}
private boolean isValid(int day, int month, int year) {
// Your validation logic should go here.
}
与setDay
类似,您可以定义setMonth
和setYear
来设置日期和月份。您的验证逻辑应该进入isValid
。
答案 1 :(得分:0)
你的设计很差,只有2分:
具有单独的setter允许状态(字段)无效,直到调用所有setter。这是不好的。同样糟糕的是,如果您从3月31日更改为2月28日(均有效),但碰巧更改月份,则日期暂时无效(2月31日)。还不错。
3个字段应使用一个设置所有3的方法设置 atomically (在一个操作中)。
你有二传手!使您的类不可变(没有setter,final字段)。如果你需要改变"约会,做一个新的。 String就像这样 - 它也适合你。
class MyDate{
final int JANUARY = 1;
final int FEBRUARY = 2;
final int MARCH = 3;
final int APRIL = 4;
final int MAY = 5;
final int JUNE = 6;
final int JULY = 7;
final int AUGUST = 8;
final int SEPTEMBER = 9;
final int OCTOBER = 10;
final int NOVEMBER = 11;
final int DECEMBER = 12;
private final int day;
private final int month;
private final int year;
public MyDate(int d, int m, int y) {
day = d;
month = m;
year = y;
}
public int getDay() {
return day;
}
public int getMonth() {
return month;
}
public int getYear() {
return year;
}
public boolean isValid() {
// put your impl here
}
}
public class E {
public static void main(String[] args){
MyDate date = new MyDate(31, 11, 2014);
System.out.println("DAY: " + date.getDay());
System.out.println("MONTH: " + date.getMonth());
System.out.println("YEAR: " + date.getYear());
}
}
如果需要,可以在构造函数中添加一行以仅允许有效日期:
if (!isValid())
throw new IllegalArgumentException();
答案 2 :(得分:0)
以下是使用Constructor初始化Variable的示例:
检查 FEBRUARY 并将日期限制更改为 28 ,如果False将最大日期定义为 30~31
class MyDate{
private int day;
private int month;
private int year;
public MyDate(){
this(1,1,2014);
}
public MyDate(int day, int month, int year){
this.day = day;
this.month = month;
this.year = year;
}
public int getDay()
{
return day;
}
public int getMonth()
{
return month;
}
public int getYear()
{
return year;
}
public boolean setDay(int day)
{
if(month == 2){
if(day>0 && day <=28){
this.day = day;
return true;
}else{
return false;
}
}else{
if( month % 2 != 0){
if(day>0 && day <=31){
this.day = day;
return true;
}else{
return false;
}
}else{
if(day>0 && day <=30){
this.day = day;
return true;
}else{
return false;
}
}
}
}
public boolean setMonth(int month)
{
if(month>0 && month <=12){
this.month = month;
return true;
}else{
return false;
}
}
public boolean setYear(int year)
{
// Not Required
if(year>1993 && year <=2018){
this.year = year;
return true;
}else{
return false;
}
}
}
public class E{
public static void main(String[] args){
MyDate date = new MyDate();
date.setDay(31);
date.setMonth(11);
date.setYear(2014);
System.out.println("DAY: "+date.getDay());
System.out.println("MONTH: "+date.getMonth());
System.out.println("YEAR: "+date.getYear());
}
}
答案 3 :(得分:0)
我必须使用不带参数的构造函数初始化这些属性。
除非您需要为这些参数提供明确的起始值,否则您已完成该步骤。 Java将set an initial value for your fields,因此在您键入int
时,每个new MyDate()
都会设置为0。
如果 需要从特定值开始,则将它们直接放入no-arg构造函数的主体中。
public MyDate() {
this.year = 2015;
this.month = 1;
this.day = 7;
}
我不知道如何使用构造函数初始化属性,同时我在调用set方法时已经在main中初始化它们
从某种意义上说,这就是POJOs的工作方式。你创建了一些具有相当数量字段的类,但你只设置了你关心的那些。
因为您可以依赖Java语言规范提供的初始值保证,所以您不必担心初始化这些值,除非您要求它们是零之外的显式初始值。
答案 4 :(得分:-1)
如果你不能将任何参数传递给构造函数,那么你所能做的就是将对象的变量初始化为零。但是,在您调用包含验证代码的set方法之前,该对象不会包含有效日期。这样做的主要原因是避免&#34;变量可能没有初始化&#34;错误。
public MyDate(){
year = 0;
month = 0;
day = 0;
}
请确保setDay的验证码检查月份和年份是否仍然等于零,否则将无法确定日期值是否有效。