0

对于以下示例,

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

有没有其他方便的方法可以做到这一点。上述实施的潜在问题是什么。

4

1 回答 1

6

这样做是一个非常糟糕的主意:您的基类将在其构造函数中调用子类的方法,因此会在尚未初始化的对象上调用方法。您最好在其构造函数中传递超类所需的所有数据:

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;
    }
}
于 2013-05-18T11:47:08.727 回答