当用户将值直接输入对象时,如何进行输入验证?-JAVA

时间:2015-02-27 17:42:10

标签: java oop

这可能实现或者我错误地理解了这个问题吗? 这是个问题:

实现一个具有整数数据成员的MyDate类来存储月,日, 和年。该类应该有一个允许的三参数构造函数 在创建新MyDate对象时设置的日期。如果用户创建了 MyDate对象没有传递任何参数,或者传递了任何值 无效,默认值为1,1,2001(即2001年1月1日)应该是 用过的。该类应具有成员函数以在下面打印日期 格式:

3/15/10
2010年3月15日
2010年3月15日

通过编写一个类TestMyDate来演示MyDate类的用法 声明MyDate类型的对象并使用all显示它的main方法 3种格式。 输入验证:仅接受月份1到12之间的值 当天1和31,以及1950年和2020年之间。

我已经实现了这个问题,但是在创建新对象时插入值时,我似乎无法验证用户输入。我怎样才能做到这一点?请不要告诉我做研究,因为我已经做过了。如果Google可以向我提供答案,我将不会来到这里。请帮帮我。

这是我的代码:
MyDate课程:

package Number1;

public class MyDate {

private int month;
private int day;
private int year;

public MyDate()
{
    month = 1;
    day = 1;
    year = 2001;
}

public MyDate(int m,int d,int y)
{
    this.month = m;
    this.day = d;
    this.year = y;
}

public int getMonth()
{
    return month;
}

public int getDay()
{
    return day;
}

public int getYear()
{
    return year;
}

public void Format1()
{
    int m,d,y,afterM;
    m = getMonth();
    d = getDay();
    y = getYear();

    afterM = y % 100;

    System.out.println(""+m+"/"+d+"/"+afterM);
}

public void Format2()
{
    int m,d,y;
    String word = null;
    m = getMonth();
    d = getDay();
    y = getYear();

    switch(m)
    {
    case 1:
    {
        word = "January";
        break;
    }
    case 2:
    {
        word = "February";
        break;
    }
    case 3:
    {
        word = "March";
        break;
    }
    case 4:
    {
        word = "April";
        break;
    }
    case 5:
    {
        word = "May";
        break;
    }
    case 6:
    {
        word = "June";
        break;
    }
    case 7:
    {
        word = "July";
        break;
    }
    case 8:
    {
        word = "August";
        break;
    }
    case 9:
    {
        word = "September";
        break;
    }
    case 10:
    {
        word = "October";
        break;
    }
    case 11:
    {
        word = "November";
        break;
    }
    case 12:
    {
        word = "December";
        break;
    }
    default:
    {
        System.out.println("Please enter a number between 1-12");
        break;
    }
    }

    System.out.println(""+word+" "+d+","+y);
}

public void Format3()
{
    int m,d,y;
    String word = null;
    m = getMonth();
    d = getDay();
    y = getYear();

    switch(m)
    {
    case 1:
    {
        word = "January";
        break;
    }
    case 2:
    {
        word = "February";
        break;
    }
    case 3:
    {
        word = "March";
        break;
    }
    case 4:
    {
        word = "April";
        break;
    }
    case 5:
    {
        word = "May";
        break;
    }
    case 6:
    {
        word = "June";
        break;
    }
    case 7:
    {
        word = "July";
        break;
    }
    case 8:
    {
        word = "August";
        break;
    }
    case 9:
    {
        word = "September";
        break;
    }
    case 10:
    {
        word = "October";
        break;
    }
    case 11:
    {
        word = "November";
        break;
    }
    case 12:
    {
        word = "December";
        break;
    }
    default:
    {
        System.out.println("Please enter a number between 1-12");
        break;
    }
    }

    System.out.println(""+d+" "+word+" "+y);

}
}

主要的TestMyDate:

package Number1;

public class TestMyDate {

public static void main(String[] args) {
    MyDate D = new MyDate(7,23,2013);

    D.Format1();
    System.out.println();
    D.Format2();
    System.out.println();
    D.Format3();

}

}

这些代码仅返回这些不同格式的日期。感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

我认为您可以在throw new IllegalArgumentException("illegal date")中进行验证和MyDate(),以使所有客户端代码严格遵守规则:

public MyDate(int m,int d,int y)
{
    // do some validate here
    if (!validate(m, d, y))
        throw new IllegalArgumentException("illegal date")
    this.month = m;
    this.day = d;
    this.year = y;
}

private boolean validate(int m, int d, int y){
    // use here as the central place of your validation (Format1(), Format2(), Format3(), ...)
}

答案 1 :(得分:1)

我建议你

  • 输入您需要阅读的值
  • 验证您输入的内容。
  • 只有您有有效数据才能创建对象。

我建议你不要用类来输入它自己的值。这使得课程过于复杂。

我还建议你使用数组而不是long switch语句。您可以使用两行代码替换switch语句。

答案 2 :(得分:1)

在将它们分配给成员变量之前,您需要在构造函数中运行验证。您最好的选择是创建返回bool的私有方法,以便在将setter添加到这些属性时可以重用逻辑。

public MyDate(int m, int d, int y)
{
    if (monthIsValid(m)) {
        this.month = m;
    }
    if (dayIsValid(d)) {
        this.day = d;
    }
    if (yearIsValid(y)) {
        this.year = y;
    }
}

使用switch语句很好,虽然我只在一个地方使用它,并从Format方法调用它。