80 * @param dayOfWeek день недели по отношению к эталонной дате.
81 * @param relative признак выбора дня недели (preceding, nearest
82 * или following).
83 */
84 public RelativeDayOfWeekRule(final AnnualDateRule subrule,
85 final int dayOfWeek, final int relative) {
86 this.subrule = subrule;
87 this.dayOfWeek = dayOfWeek;
88 this.relative = relative;
89 }
90
91 /**
Листинг Б.6 (продолжение)
92 * Возвращает субправило (также называемое эталонным правилом).
93 *
94 * @return Правило ежегодной даты, определяющее эталонную дату
95 * для текущего правила.
96 */
97 public AnnualDateRule getSubrule() {
98 return this.subrule;
99 }
100
101 /**
102 * Назначает субправило.
103 *
104 * @param subrule Правило ежегодной даты, определяющее эталонную дату
105 * для текущего правила.
106 */
107 public void setSubrule(final AnnualDateRule subrule) {
108 this.subrule = subrule;
109 }
110
111 /**
112 * Возвращает день недели для текущего правила.
113 *
114 * @return день недели для текущего правила.
115 */
116 public int getDayOfWeek() {
117 return this.dayOfWeek;
118 }
119
120 /**
121 * Назначает день недели для текущего правила.
122 *
123 * @param dayOfWeek день недели (SerialDate.MONDAY,
124 * SerialDate.TUESDAY и т.д.).
125 */
126 public void setDayOfWeek(final int dayOfWeek) {
127 this.dayOfWeek = dayOfWeek;
128 }
129
130 /**
131 * Возвращает атрибут ‘relative’, который определяет,
132 * *какой* день недели нас интересует (SerialDate.PRECEDING,
133 * SerialDate.NEAREST или SerialDate.FOLLOWING).
134 *
135 * @return атрибут 'relative'.
136 */
137 public int getRelative() {
138 return this.relative;
139 }
140
141 /**
142 * Задает атрибут 'relative' (SerialDate.PRECEDING, SerialDate.NEAREST,
143 * SerialDate.FOLLOWING).
144 *
145 * @param relative определяет, *какой* день недели выбирается
146 * текущим правилом.
147 */
148 public void setRelative(final int relative) {
149 this.relative = relative;
150 }
151
152 /**
153 * Создает копию текущего правила.
154 *
155 * @return копия текущего правила.
156 *
157 * @throws CloneNotSupportedException this should never happen.
158 */
159 public Object clone() throws CloneNotSupportedException {
160 final RelativeDayOfWeekRule duplicate
161 = (RelativeDayOfWeekRule) super.clone();
162 duplicate.subrule = (AnnualDateRule) duplicate.getSubrule().clone();
163 return duplicate;
164 }
165
166 /**
167 * Возвращает дату, сгенерированную текущим правилом для заданного года.
168 *
169 * @param year год (1900 <= год <= 9999).
170 *
171 * @return дата, сгенерированная правилом для заданного года
172 * (допускается null
).
173 */
174 public SerialDate getDate(final int year) {
175
176 // Проверить аргумент...
177 if ((year < SerialDate.MINIMUM_YEAR_SUPPORTED)
178 || (year > SerialDate.MAXIMUM_YEAR_SUPPORTED)) {
179 throw new IllegalArgumentException(
180 "RelativeDayOfWeekRule.getDate(): year outside valid range.");
181 }
182
183 // Вычислить дату...
184 SerialDate result = null;
185 final SerialDate base = this.subrule.getDate(year);
186
187 if (base != null) {
188 switch (this.relative) {
189 case(SerialDate.PRECEDING):
190 result = SerialDate.getPreviousDayOfWeek(this.dayOfWeek,
191 base);
192 break;
Листинг Б.6 (продолжение)
193 case(SerialDate.NEAREST):
194 result = SerialDate.getNearestDayOfWeek(this.dayOfWeek,
195 base);
196 break;
197 case(SerialDate.FOLLOWING):
198 result = SerialDate.getFollowingDayOfWeek(this.dayOfWeek,
199 base);
200 break;
201 default:
202 break;
203 }
204 }
205 return result;
206
207 }
208
209 }
Листинг Б.7. DayDate.java (окончательная версия)
1 /* ========================================================================