![](/img/trans.png)
[英]Constructor error “call to this must be first statement in constructor”
[英]“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.