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

>

>  70  *

>  71  * Excel считает, что 1 января 1900 = 1.  Этот класс считает, что

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

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

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

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

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

>  77  *

>  78  * @author Дэвид Гилберт

>  79  */

>  80 public class SpreadsheetDate extends SerialDate {

>  81

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

>  83     private static final long serialVersionUID = -2039586705374454461L;

>  84

>  85     /**


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

>  86      * Номер дня (1.01.1900 = 2, 2.01.1900 = 3, ..., 31.12.9999 =

>  87      * 2958465).

>  88      */

>  89     private int serial;

>  90

>  91     /** День месяца (от 1 до 28, 29, 30 или 31 в зависимости от месяца). */

>  92     private int day;

>  93

>  94     /** Месяц года (от 1 по 12). */

>  95     private int month;

>  96

>  97     /** Год (от 1900 до 9999). */

>  98     private int year;

>  99

>100     /** Необязательное описание даты. */

>101     private String description;

>102

>103     /**

>104      * Создает новый экземпляр даты.

>105      *

>106      * @param day  день (в диапазоне от 1 до 28/29/30/31).

>107      * @param month  месяц (в диапазоне от 1 до 12).

>108      * @param year  год (в диапазоне от 1900 до 9999).

>109      */

>110     public SpreadsheetDate(final int day, final int month, final int year) {

>111

>112         if ((year >= 1900) && (year <= 9999)) {

>113             this.year = year;

>114         }

>115         else {

>116             throw new IllegalArgumentException(

>117                 "The 'year' argument must be in range 1900 to 9999."

>118             );

>119         }

>120

>121         if ((month >= MonthConstants.JANUARY)

>122                 && (month <= MonthConstants.DECEMBER)) {

>123             this.month = month;

>124         }

>125         else {

>126             throw new IllegalArgumentException(

>127                 "The 'month' argument must be in the range 1 to 12."

>128             );

>129         }

>130

>131         if ((day >= 1) && (day <= SerialDate.lastDayOfMonth(month, year))) {

>132             this.day = day;

>133         }

>134         else {

>135             throw new IllegalArgumentException("Invalid 'day' argument.");

>136         }

>137

>138         // Порядковый номер должен синхронизироваться с днем-месяцем-годом...

>139         this.serial = calcSerial(day, month, year);

>140

>141         this.description = null;

>142

>143     }

>144

>145     /**

>146      * Стандартный конструктор - создает новый объект даты, представляющий