覆盖字段初始化

时间:2013-05-18 11:40:53

标签: java oop design-patterns

对于以下示例,

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());

还有其他方便的方法吗?上述实施的潜在问题是什么。

1 个答案:

答案 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;
    }
}