我不知道如何在这个构造函数中初始化属性

时间:2015-01-08 03:14:45

标签: java

我有下一个代码,此代码必须验证日期,但我必须遵循一些要求:

首先,我必须创建一个名为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());
    }
}

5 个答案:

答案 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类似,您可以定义setMonthsetYear来设置日期和月份。您的验证逻辑应该进入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的验证码检查月份和年份是否仍然等于零,否则将无法确定日期值是否有效。