0

我正在尝试制作一个接受字符串并构造日期对象的构造函数。到目前为止,这是我的解决方案,但我收到此错误:

构造函数调用必须是构造函数中的第一条语句

private int m;
private int d;
private int y;
private String[] dateStrings;

public Date(int month, int day, int year) {
          m = month;
          d = day;
          y = year;  
  }

public Date(String s) {
      dateStrings = s.split("/");
      this(Integer.parseInt(dateStrings[0]), Integer.parseInt(dateStrings[1]), Integer.parseInt(dateStrings[2]));
  }

我意识到我首先需要this(...)一切,但是当我需要先填充 dateStrings 时,我该怎么做?我怎样才能避免这个错误?注意:要使用字符串构造日期,格式为“月/日/年”

4

2 回答 2

2

this()需要先调用。

而是将分配移动到私有方法。

private void assginValues (int month, int day, int year){
          m = month;
          d = day;
          y = year;  
}

如果您还需要dateStrings填充,您也可以使用此方法构建它。

然后从两个构造函数中调用该方法。确保接受 String 的构造函数不会调用this(),因为共享方法负责分配值。

您也可以在一行中完成所有操作,但是您split()多次调用这很浪费

this(Integer.parseInt(s.split("/")[0]), Integer.parseInt(s.split("/")[1]), Integer.parseInt(s.split("/")[2]));
于 2013-02-14T03:58:20.503 回答
1

我发现避免它的最好方法是使用静态工厂

public static Date MakeDate(String s) {
  dateStrings = s.split("/");
  return new Date(Integer.parseInt(dateStrings[0]), Integer.parseInt(dateStrings[1]),  
     Integer.parseInt(dateStrings[2]));
 }

并且出于一致的考虑,我可能会重载它,并避免拥有一个工厂和一个构造函数的整个怪异。

 private Date(int month, int day, int year) {
      m = month;
      d = day;
      y = year;  
  }

 public static MakeDate(int mont, int day, int year){
      //You can figure this part out
 }

这样做的一个好处是您可以对这些工厂进行不同的命名,以明确它们的意图。在这种情况下可能没有必要,但它是一个不错的选择,尤其是对于更复杂的类。

于 2013-02-14T03:59:45.863 回答