Чистый код. Создание, анализ и рефакторинг (Мартин) - страница 307

>   5 public class SpreadsheetDateFactory extends DayDateFactory {

>   6   public DayDate _makeDate(int ordinal) {

>   7     return new SpreadsheetDate(ordinal);

>   8   }

>   9

>  10   public DayDate _makeDate(int day, Month month, int year) {

>  11     return new SpreadsheetDate(day, month, year);

>  12   }

>  13

>  14   public DayDate _makeDate(int day, int month, int year) {

>  15     return new SpreadsheetDate(day, month, year);

>  16   }

>  17

>  18   public DayDate _makeDate(Date date) {

>  19     final GregorianCalendar calendar = new GregorianCalendar();

>  20     calendar.setTime(date);

>  21     return new SpreadsheetDate(

>  22       calendar.get(Calendar.DATE),

>  23       Month.fromInt(calendar.get(Calendar.MONTH) + 1),

>  24       calendar.get(Calendar.YEAR));

>  25   }

>  26

>  27   protected int _getMinimumYear() {

>  28     return SpreadsheetDate.MINIMUM_YEAR_SUPPORTED;

>  29   }

>  30

>  31   protected int _getMaximumYear() {

>  32     return SpreadsheetDate.MAXIMUM_YEAR_SUPPORTED;

>  33   }

>  34 }

Листинг Б.16. SpreadsheetDate.java (окончательная версия)

>   1 /* ========================================================================

>   2  * JCommon : библиотека классов общего назначения для платформы Java(tm)

>   3  * ========================================================================

>   4  *

>   5  * (C) Copyright 2000–2005, by Object Refinery Limited and Contributors.

>   6  *

>...

>  52  *

>  53  */

>  54

>  55 package org.jfree.date;

>  56

>  57 import static org.jfree.date.Month.FEBRUARY;

>  58

>  59 import java.util.*;

>  60

>  61 /**

>  62  * Представляет дату с использованием целого числа, по аналогии с реализацией

>  63  * в Microsoft Excel.  Поддерживаемый диапазон дат:

>  64  * с 1 января 1900 по 31 декабря 9999.

>  65  *

>  66  * Учтите, что в Excel существует намеренная ошибка, вследствие которой год

>  67  * 1900 считается високосным, тогда как в действительности он таковым не является.

>  68  * Дополнительная информация приведена на сайте Microsoft в статье Q181370:

>  69  *

>  70  * http://support.microsoft.com/support/kb/articles/Q181/3/70.asp

>  71  *

>  72  * По правилам Excel 1 января 1900 = 1.  По правилам этого класса

>  73  * 1 января 1900 = 2.

>  74  * В результате номер дня этого класса будет отличаться от номера Excel

>  75  * в январе и феврале 1900...но затем Excel прибавляет лишний день

>  76  * (29 февраля 1900, который в действительности не существует!), и с этого

>  77  *  момента нумерация дней совпадает.

>  78  *

>  79  * @author David Gilbert

>  80  */

>  81 public class SpreadsheetDate extends DayDate {

>  82   public static final int EARLIEST_DATE_ORDINAL = 2;     // 1/1/1900