对于以下示例,
public abstract class RecordData {
private MyDate mDate = new MyDate(new SimpleDateFormat(""yyyy-MM-dd HH:mm:ss"));
public Date getMyDate() {
return mDate.getDate();
}
.....
}
我想实现类来覆盖日期格式。这样做的一种方法是使用这样的方法:
protected SimpleDateFormat getDateForm() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
}
所以,初始化应该是这样的:
MyDate mDate = new MyDate(getDateForm());
还有其他方便的方法吗?上述实施的潜在问题是什么。
答案 0 :(得分:5)
这样做是一个非常糟糕的主意:你的基类会在其构造函数中调用子类的方法,因此会在尚未初始化的对象上调用方法。您最好在其构造函数中传递超类所需的所有数据:
public abstract class RecordData {
private MyDate mDate;
protected RecordData(String datePattern) {
this.mDate = new MyDate(new SimpleDateFormat(datePattern));
}
}
做其他人的建议会完全打破这种基本实现:
public class SubRecordData extends RecordData {
private SimpleDateFormat dateFormat;
public SubRecordData(String pattern) {
this.dateFormat = new SimpleDateFormat(pattern);
}
// broken: when this method is called by the base class constructor,
// dateFormat is still null
@Override
protected SimpleDateFormat getDateFormat() {
return dateFormat;
}
}