Java Date类 - 构造函数中的switch和ifs

时间:2018-03-22 17:38:13

标签: java date constructor switch-statement

我是初学者,我有一个编写Date类的任务(作为更大项目的一部分)。 在我的问题中,我专注于构造函数。这里有一些背景知识: 给定的指导原则是预期日期无效,以下实例变量需要此输入范围: 日 - 整数1-31 月 - 整数1-12 年 - 整数4位数年。

现在,如果输入无效的日/月/年或无效日期(例如31.2.2010),将创建日期为1.1.2000的对象。

这是我提出的代码,它确实编译并且似乎工作正常。

public class Date
{
private int _day;
private int _month;
private int _year;


public Date (int day, int month, int year)  
{
    switch (month)
    {
        case 1:                
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12: if ((day>0 && day<32) && (year>999 && year<10000))
        {
            _day=day;
            _month=month;
            _year=year;           
        }
        else
        {
            _day=1;
            _month=1;
            _year=2000;
        }
        break;

        case 4:
        case 6:
        case 9:
        case 11: if ((day>0 && day<31) && (year>999 && year<10000))
        {
            _day=day;
            _month=month;
            _year=year;           
        }
        else
        {
            _day=1;
            _month=1;
            _year=2000;
        }
        break;

        case 2: if (leap(year))
        {
            if ((day>0 && day<30) && (year>999 && year<10000))
            {
                _day=day;
                _month=month;
                _year=year;           
            }
            else
            {
                _day=1;
                _month=1;
                _year=2000;
            }
            break;
        }

        else
        {
            if ((day>0 && day<29) && (year>999 && year<10000))
            {
                _day=day;
                _month=month;
                _year=year;           
            }
            else
            {
                _day=1;
                _month=1;
                _year=2000;
            }
            break;
        }
    }
}

/** check if leap year */
private boolean leap (int y)  
{
    return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}

}

这是我的问题:

  1. 将所有代码放在构造函数中是否可以?它会大大影响处理时间或导致错误吗?如果有问题会有替代方案吗?
  2. 代码的任何部分都被视为不良做法?如开关和ifs? 尽管它工作得很好,但我对这个版本没有信心......

1 个答案:

答案 0 :(得分:0)

  

将所有代码放在构造函数中是否可以?它会大大影响处理时间或导致错误吗?如果有问题会有替代方案吗?

嗯,构造函数体中的代码没有任何问题。只要您的语法正确,您的代码将始终正常运行。但是,您需要知道的一件重要事情是:当构造函数体中的代码的复杂性达到一定水平时,它开始告诉您的处理时间。一个很好的例子是在构造函数中有多个循环和/或繁重的后台进程的情况。 这就是为什么在构造函数体中放置繁重的进程是不赞成的(但不是禁止的)。

  

代码的任何部分都被视为不良做法?

您可以通过多种方式优化代码:

  1. 您可以为全局变量和实例变量指定相同名称,并使用this关键字区分它们。即:this.day = day;

  2. 利用Java中已有的类和包。 Calendar类具有返回一个月中的天数的方法,依此类推。而不是重新发明轮子,使用它们。检查this question,了解如何获取一个月内的天数。还有许多其他方法也可能对您有用。

  3. 最后,您可以声明一个单独的方法将值设置为您选择的默认状态(01-01-2000),这样您就不必每次都设置它,这会大大减少您的行代码。

  4. 我希望这有帮助..快乐编码!