I am reading Uncle Bob's Clean Code. In chapter 16, the book shows how to refactor an example. There is one part that I cannot catch the purpose of writing in such way.
- What the purpose of using protected keyword here?
- Why do some methods like _getMinimumYear()start with an underscore?
- Why do use a pair of method with same name rather than an abstract method like public abstract int getMinimumYear();
public abstract class DayDateFactory {
    private static DayDateFactory factory = new SpreadsheetDateFactory();
    public static void setInstance(DayDateFactory factory) {
        DayDateFactory.factory = factory;
    }
    protected abstract DayDate _makeDate(int ordinal);
    protected abstract DayDate _makeDate(int day, Month month, int year);
    protected abstract DayDate _makeDate(int day, int month, int year);
    protected abstract DayDate _makeDate(java.util.Date date);
    protected abstract int _getMinimumYear();
    protected abstract int _getMaximumYear();
    public static DayDate makeDate(int ordinal) {
      return factory._makeDate(ordinal);
    }
    public static DayDate makeDate(int day, Month month, int year) {
      return factory._makeDate(day, month, year);
    }
    public static DayDate makeDate(int day, int month, int year) {
      return factory._makeDate(day, month, year);
    }
    public static DayDate makeDate(java.util.Date date) {
      return factory._makeDate(date);
    }
    public static int getMinimumYear() {
      return factory._getMinimumYear();
    }
    public static int getMaximumYear() {
      return factory._getMaximumYear();
    }
}
    public class SpreadsheetDateFactory extends DayDateFactory {
    public DayDate _makeDate(int ordinal) {
    return new SpreadsheetDate(ordinal);
    }
    public DayDate _makeDate(int day, Month month, int year) {
    return new SpreadsheetDate(day, month, year);
    }
    public DayDate _makeDate(int day, int month, int year) {
    return new SpreadsheetDate(day, month, year);
    }
    public DayDate _makeDate(Date date) {
    final GregorianCalendar calendar = new GregorianCalendar();
    calendar.setTime(date);
    return new SpreadsheetDate(
    calendar.get(Calendar.DATE),
    Month.fromInt(calendar.get(Calendar.MONTH) + 1),
    calendar.get(Calendar.YEAR));
    }
    protected int _getMinimumYear() {
    return SpreadsheetDate.MINIMUM_YEAR_SUPPORTED;
    }
    protected int _getMaximumYear() {
    return SpreadsheetDate.MAXIMUM_YEAR_SUPPORTED;
    }
}
 
     
    