JAVA隐式调用工厂方法

时间:2017-07-25 17:26:55

标签: java constructor factory-pattern

我的Date类有1个构造函数和1个工厂方法。第一个只有3个int参数代表月,日和年。第二个,我提供它以防万一用户将字符串作为一个参数来表示月/日/年。

正如你在main()中看到的,我忘了调用parseIt,工厂方法。但编译器仍提供正确的结果。所以问题是:JAVA可以隐式调用这个工厂方法吗?

请查看第一个构造函数和第二个工厂方法:

import java.io.*;

class Date {

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

  public Date(int month, int day, int year) {
    if (isValidDate(month, day, year)) {
      this.month = month;
      this.day = day;
      this.year = year;
    } else {
      System.out.println("Fatal error:  Invalid data.");
      System.exit(0);
    }
  }

  public static Date parseIt(String s) {
    String[] strSplit = s.split("/");
    int m = Integer.parseInt(strSplit[0]);
    int d = Integer.parseInt(strSplit[1]);
    int y = Integer.parseInt(strSplit[2]);
    return new Date(m, d, y);
  }

  public static boolean isLeapYear(int year) {
    if (year%4 != 0) {
      return false;
    } else if (year%100 == 0 && year%400 != 0) {
      return false;
    }
    return true;
  }

  public static int daysInMonth(int month, int year) {
    if (month == 2) {
      if (isLeapYear(year)) {
        return 29;
      } else {
        return 28;
      }
    } else if (month == 4 || month == 6 || month == 9 || month == 11) {
      return 30;
    } else {
      return 31;
    }
  }

  public static boolean isValidDate(int month, int day, int year) {
    if (year < 1 || year > 9999 || month <= 0 || month > 12 || day <= 0) {
      return false;
    } else if (day > daysInMonth(month, year)) {
      return false;
    }
    return true;  
  }

  public static void main(String[] argv) {
    Date d1 = new Date(1, 1, 1);
    System.out.println("Date should be 1/1/1: " + d1);
    d1 = new Date("2/4/2");
    System.out.println("Date should be 2/4/2: " + d1);
  }
}

1 个答案:

答案 0 :(得分:0)

不,它不会。没有构造函数接收字符串,因此会抛出语法错误。为了使其工作,您必须定义一个构造函数,该构造函数接受String参数执行与parseIt(String)函数相同的逻辑。