Чистый код. Создание, анализ и рефакторинг — страница 68 из 94

Листинг Б.1. SerialDate.Java

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

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

   3  * ========================================================================

   4  *

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

   6  *

   7  * Информация о проекте:  http://www.jfree.org/jcommon/index.html

   8  *

   9  * Библиотека распространяется бесплатно; вы можете свободно распространять

  10  * и/или изменять ее на условиях лицензии Lesser General Public License

  11  * в формулировке Free Software Foundation; либо версии 2.1 лицензии, либо

  12  * (на ваше усмотрение) любой последующей версии.

  13  *

  14  * Библиотека распространяется в надежде, что она будет полезна, но

  15  * БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемой гарантии ПРИГОДНОСТИ

  16  * для КОНКРЕТНОЙ ЦЕЛИ. За подробностями обращайтесь к GNU Lesser General

  17  * Public License.

  18  *

  19  * Вы должны получить копию лицензии GNU Lesser General Public License

  20  * с этой библиотекой; если этого не произошло, обратитесь в Free Software

  21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,

  22  * USA.

  23  *

  24  * [Java является зарегистрированной торговой маркой Sun Microsystems, Inc.

  25  * в Соединенных Штатах и других странах].

  26  *

  27  * ---------------

  28  * SerialDate.java

  29  * ---------------

  30  * (C) Copyright 2001–2005, by Object Refinery Limited.

  31  *

  32  * Автор:  Дэвид Гилберт (для Object Refinery Limited);

  33  * Участники:   -;

  34  *

  35  * $Id: SerialDate.java,v 1.7 2005/11/03 09:25:17 mungady Exp $

  36  *

  37  * Изменения (начиная с 11 октября 2001)

  38  * --------------------------

  39  * 11.10.2001  : Реорганизация класса и его перемещение в новый пакет

  40  *               com.jrefinery.date (DG);

  41  * 05.12.2001  : Добавление метода getDescription(), исключение класса

  42  *               NotableDate (DG);

  43  * 12.12.2001  : После удаления класса NotableDate IBD требует наличия

  44  *               метода setDescription() (DG); исправлены ошибки  

  45  *               в функциях getPreviousDayOfWeek(), getFollowingDayOfWeek()

  46  *               и getNearestDayOfWeek() (DG);

  47  * 05.12.2001  : Исправление ошибки в классе SpreadsheetDate (DG);

  48  * 29.05.2002  : Перемещение констант месяцев в отдельный интерфейс

  49  *               (MonthConstants) (DG);

  50  * 27.08.2002  : Исправление ошибки в addMonths(), спасибо N???levka Petr (DG);

  51  * 03.10.2002  : Исправление ошибок по информации Checkstyle (DG);

  52  * 13.03.2003  : Реализация Serializable (DG);

  53  * 29.05.2003  : Исправление ошибки в методе addMonths (DG);

  54  * 04.09.2003  : Реализация Comparable. Обновление Javadoс для isInRange (DG);

  55  * 05.01.2005  : Исправление ошибки в методе addYears() (1096282) (DG);

  56  *

  57  */

  58

  59 package org.jfree.date;

  60

  61 import java.io.Serializable;

  62 import java.text.DateFormatSymbols;

  63 import java.text.SimpleDateFormat;

  64 import java.util.Calendar;

  65 import java.util.GregorianCalendar;

  66

  67 /**

  68  *  Абстрактный класс, определяющий требования для манипуляций с датами

  69  *  без привязки к конкретной реализации.

  70  *  

  71  *  Требование 1 : совпадение с представлением дат в формате Excel;

  72  *  Требование 2 : класс должен быть неизменным;

  73  *  

  74  *  Почему не использовать java.util.Date? Будем использовать, где это имеет смысл.

  75  *  Класс java.util.Date бывмает *слишком* точным - он представляет момент

  76  *  времени с точностью до 1/100 секунды (при этом сама дата зависит от часового

  77  *  пояса). Иногда бывает нужно просто представить конкретный день (скажем,

  78  *  21 января 2015), не заботясь о времени суток, часовом поясе и т.д.

  79  *  Именно для таких ситуаций определяется класс SerialDate.

  80  *  

  81  *  Вы можете вызвать getInstance() для получения конкретного субкласса

  82  *  SerialDate, не беспокоясь о реализации.

  83  *

  84  * @author David Gilbert

  85  */


Листинг Б.1 (продолжение)

  86 public abstract class SerialDate implements Comparable,

  87                                             Serializable,

  88                                             MonthConstants {

  89

  90     /** Для сериализации. */

  91     private static final long serialVersionUID = -293716040467423637L;

  92

  93     /** Символические обозначения формата даты. */

  94     public static final DateFormatSymbols

  95         DATE_FORMAT_SYMBOLS = new SimpleDateFormat().getDateFormatSymbols();

  96

  97     /** Порядковый номер для 1 января 1900. */

  98     public static final int SERIAL_LOWER_BOUND = 2;

  99

100     /** Порядковый номер для 31 декабря 9999. */

101     public static final int SERIAL_UPPER_BOUND = 2958465;

102

103     /** Наименьшее значение года, поддерживаемое форматом даты. */