“构造函数调用必须是构造函数中的第一个语句”错误

时间:2013-02-14 03:54:55

标签: java

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

  

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

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时我该怎么做? 我怎样才能避免这个错误? 注意:要使用字符串构造日期,其格式为“月/日/年”

2 个答案:

答案 0 :(得分: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]));

答案 1 :(得分: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
 }

这方面的一个很好的好处是你可以用不同的方式命名这些工厂以明确其意图。在这种情况下可能没有必要,但它是一个很好的选择,特别是对于更复杂的类。