繁体   English   中英

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

[英]“Constructor call must be the first statement in a constructor” error

我试图做一个构造函数,它接受一个字符串并构造一个日期对象。 到目前为止,这是我的解决方案,但出现此错误:

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

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

this()需要被调用。

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

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

如果还需要填充dateStrings ,则也可以在此方法中进行构建。

然后从两个构造函数调用该方法。 确保共享字符串的构造函数不会调用this()因为共享方法将负责分配值。

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

this(Integer.parseInt(s.split("/")[0]), Integer.parseInt(s.split("/")[1]), Integer.parseInt(s.split("/")[2]));

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

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
 }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM