Создание, анализ ирефакторинг
Скачать 3.16 Mb.
|
433 237 * Возвращает код, представляющий день недели. 238 * 239 * Коды определяются в классе {@link SerialDate} следующим образом: 240 * SUNDAY , MONDAY , TUESDAY ,241 * WEDNESDAY , THURSDAY , FRIDAY и242 * SATURDAY .243 * 244 * @return Код, представляющий день недели. 245 */ 246 public int getDayOfWeek() { 247 return (this.serial + 6) % 7 + 1; 248 } 249 250 /** 251 * Проверяет равенство текущей даты с другим произвольным объектом. 252 * 253 * Метод возвращает true ТОЛЬКО в том случае, если объект является 254 * экземпляром базового класса {@link SerialDate} и представляет тот же 255 * день, что и {@link SpreadsheetDate}. 256 * 257 * @param object объект для сравнения (допускается null ).258 * 259 * @return Логический признак. 260 */ 261 public boolean equals(final Object object) { 262 263 if (object instanceof SerialDate) { 264 final SerialDate s = (SerialDate) object; 265 return (s.toSerial() == this.toSerial()); 266 } 267 else { 268 return false; 269 } 270 271 } 272 273 /** 274 * Возвращает хеш-код для экземпляра класса. 275 * 276 * @return хеш-код. 277 */ 278 public int hashCode() { 279 return toSerial(); 280 } 281 282 /** 283 * Возвращает разность (в днях) между текущей и заданной 284 * 'другой' датой. 285 * 286 * @param other дата для сравнения. 287 * продолжение 433 434 Приложение Б . org.jfree.date.SerialDate листинг Б .5 (продолжение) 288 * @return разность (в днях) между текущий и заданной 289 * 'другой' датой. 290 */ 291 public int compare(final SerialDate other) { 292 return this.serial - other.toSerial(); 293 } 294 295 /** 296 * Реализует метод, необходимый для интерфейса Comparable. 297 * 298 * @param other другой объект (обычно другой объект SerialDate). 299 * 300 * @return отрицательное целое, нуль или положительное целое число, 301 * если объект меньше, равен или больше заданного объекта. 302 */ 303 public int compareTo(final Object other) { 304 return compare((SerialDate) other); 305 } 306 307 /** 308 * Возвращает true, если текущий объект SerialDate представляет ту же дату, 309 * что и заданный объект SerialDate. 310 * 311 * @param other дата для сравнения. 312 * 313 * @return true , если текущий объект SerialDate представляет314 * ту же дату, что и заданный объект SerialDate. 315 */ 316 public boolean isOn(final SerialDate other) { 317 return (this.serial == other.toSerial()); 318 } 319 320 /** 321 * Возвращает true, если текущий объект SerialDate представляет более раннюю 322 * дату по сравнению с заданным объектом SerialDate. 323 * 324 * @param other дата для сравнения. 325 * 326 * @return true , если текущий объект SerialDate представляет327 * более раннюю дату по сравнению с заданным объектом SerialDate. 328 */ 329 public boolean isBefore(final SerialDate other) { 330 return (this.serial < other.toSerial()); 331 } 332 333 /** 334 * Возвращает true, если текущий объект SerialDate представляет ту же дату, 335 * что и заданный объект SerialDate. 336 * 337 * @param other дата для сравнения. 434 org.jfree.date.SerialDate 435 338 * 339 * @return true , если текущий объект SerialDate представляет340 * ту же дату, что и заданный объект SerialDate. 341 */ 342 public boolean isOnOrBefore(final SerialDate other) { 343 return (this.serial <= other.toSerial()); 344 } 345 346 /** 347 * Возвращает true, если текущий объект SerialDate представляет ту же дату, 348 * что и заданный объект SerialDate. 349 * 350 * @param other дата для сравнения. 351 * 352 * @return true , если текущий объект SerialDate представляет353 * ту же дату, что и заданный объект SerialDate. 354 */ 355 public boolean isAfter(final SerialDate other) { 356 return (this.serial > other.toSerial()); 357 } 358 359 /** 360 * Возвращает true, если текущий объект SerialDate представляет ту же дату, 361 * что и заданный объект SerialDate. 362 * 363 * @param other дата для сравнения. 364 * 365 * @return true , если текущий объект SerialDate представляет366 * ту же дату, что и заданный объект SerialDate. 367 */ 368 public boolean isOnOrAfter(final SerialDate other) { 369 return (this.serial >= other.toSerial()); 370 } 371 372 /** 373 * Возвращает true , если текущий объект {@link SerialDate} принадлежит374 * заданному диапазону (режим INCLUSIVE). Порядок дат d1 и d2 375 * не важен. 376 * 377 * @param d1 граничная дата диапазона. 378 * @param d2 другая граничная дата диапазона. 379 * 380 * @return логический признак. 381 */ 382 public boolean isInRange(final SerialDate d1, final SerialDate d2) { 383 return isInRange(d1, d2, SerialDate.INCLUDE_BOTH); 384 } 385 386 /** 387 * Возвращает true , если текущий объект SerialDate принадлежитпродолжение 435 436 Приложение Б . org.jfree.date.SerialDate листинг Б .5 (продолжение) 388 * заданному диапазону (включение границ указывается при вызове). Порядок 389 * d1 и d2 не важен. 390 * 391 * @param d1 граничная дата диапазона. 392 * @param d2 другая граничная дата диапазона. 393 * @param include код, управляющий включением начальной и конечной дат 394 * в диапазон. 395 * 396 * @return true , если текущий объект SerialDate принадлежит397 * заданному диапазону. 398 */ 399 public boolean isInRange(final SerialDate d1, final SerialDate d2, 400 final int include) { 401 final int s1 = d1.toSerial(); 402 final int s2 = d2.toSerial(); 403 final int start = Math.min(s1, s2); 404 final int end = Math.max(s1, s2); 405 406 final int s = toSerial(); 407 if (include == SerialDate.INCLUDE_BOTH) { 408 return (s >= start && s <= end); 409 } 410 else if (include == SerialDate.INCLUDE_FIRST) { 411 return (s >= start && s < end); 412 } 413 else if (include == SerialDate.INCLUDE_SECOND) { 414 return (s > start && s <= end); 415 } 416 else { 417 return (s > start && s < end); 418 } 419 } 420 421 /** 422 * Вычисляет порядковый номер по дню, месяцу и году. 423 * 424 * 1 января 1900 = 2. 425 * 426 * @param d день. 427 * @param m месяц. 428 * @param y год. 429 * 430 * @return порядковый номер для заданного дня, месяца и года. 431 */ 432 private int calcSerial(final int d, final int m, final int y) { 433 final int yy = ((y - 1900) * 365) + SerialDate.leapYearCount(y - 1); 434 int mm = SerialDate.AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH[m]; 435 if (m > MonthConstants.FEBRUARY) { 436 if (SerialDate.isLeapYear(y)) { 437 mm = mm + 1; 436 org.jfree.date.SerialDate 437 438 } 439 } 440 final int dd = d; 441 return yy + mm + dd + 1; 442 } 443 444 /** 445 * Вычисляет день, месяц и год по порядковому номеру. 446 */ 447 private void calcDayMonthYear() { 448 449 // Вычислить год по порядковому номеру 450 final int days = this.serial - SERIAL_LOWER_BOUND; 451 // Переоценка из-за проигнорированных високосных дней. 452 final int overestimatedYYYY = 1900 + (days / 365); 453 final int leaps = SerialDate.leapYearCount(overestimatedYYYY); 454 final int nonleapdays = days - leaps; 455 // Недооценка из-за переоцененных лет. 456 int underestimatedYYYY = 1900 + (nonleapdays / 365); 457 458 if (underestimatedYYYY == overestimatedYYYY) { 459 this.year = underestimatedYYYY; 460 } 461 else { 462 int ss1 = calcSerial(1, 1, underestimatedYYYY); 463 while (ss1 <= this.serial) { 464 underestimatedYYYY = underestimatedYYYY + 1; 465 ss1 = calcSerial(1, 1, underestimatedYYYY); 466 } 467 this.year = underestimatedYYYY - 1; 468 } 469 470 final int ss2 = calcSerial(1, 1, this.year); 471 472 int[] daysToEndOfPrecedingMonth 473 = AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH; 474 475 if (isLeapYear(this.year)) { 476 daysToEndOfPrecedingMonth 477 = LEAP_YEAR_AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH; 478 } 479 480 // Получение месяца по порядковому номеру 481 int mm = 1; 482 int sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1; 483 while (sss < this.serial) { 484 mm = mm + 1; 485 sss = ss2 + daysToEndOfPrecedingMonth[mm] - 1; 486 } 487 this.month = mm - 1; 488 продолжение 437 438 Приложение Б . org.jfree.date.SerialDate листинг Б .5 (продолжение) 489 // Остается d(+1); 490 this.day = this.serial - ss2 491 - daysToEndOfPrecedingMonth[this.month] + 1; 492 493 } 494 495 } листинг Б .6 . RelativeDayOfWeekRule.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 * RelativeDayOfWeekRule.java 29 * -------------------------- 30 * (C) Copyright 2000-2003, by Object Refinery Limited and Contributors. 31 * 32 * Автор: Дэвид Гилберт (для Object Refinery Limited); 33 * Участники: -; 34 * 35 * $Id: RelativeDayOfWeekRule.java,v 1.6 2005/11/16 15:58:40 taqua Exp $ 36 * 37 * Изменения (начиная с 26 октября 2001) 38 * -------------------------- 39 * 26-Oct-2001 : Пакет изменен на com.jrefinery.date.*; 40 * 03-Oct-2002 : Исправлены ошибки по информации Checkstyle (DG); 41 * 438 org.jfree.date.SerialDate 439 42 */ 43 44 package org.jfree.date; 45 46 /** 47 * Правило ежегодной даты, возвращающее дату для каждого года на основании 48 * (a) эталонного правила; (б) дня недели; и (в) параметра выбора. 49 * (SerialDate.PRECEDING, SerialDate.NEAREST, SerialDate.FOLLOWING). 50 * 51 * Например, Страстная пятница может задаваться как 'пятница, ПРЕДШЕСТВУЮЩАЯ 52 * Пасхе'. 53 * 54 * @author Дэвид Гилберт 55 */ 56 public class RelativeDayOfWeekRule extends AnnualDateRule { 57 58 /** Ссылка на правило ежегодной даты, на котором основано данное правило. */ 59 private AnnualDateRule subrule; 60 61 /** 62 * День недели (SerialDate.MONDAY, SerialDate.TUESDAY и т.д.). 63 */ 64 private int dayOfWeek; 65 66 /** Признак выбора дня недели (PRECEDING, NEAREST или FOLLOWING). */ 67 private int relative; 68 69 /** 70 * Конструктор по умолчанию - строит правило для понедельника после 1 января. 71 */ 72 public RelativeDayOfWeekRule() { 73 this(new DayAndMonthRule(), SerialDate.MONDAY, SerialDate.FOLLOWING); 74 } 75 76 /** 77 * Стандартный конструктор - строит правило на основании субправила. 78 * 79 * @param subrule правило, определяющее эталонную дату. 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 /** продолжение 439 440 Приложение Б . org.jfree.date.SerialDate листинг Б .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 /** 440 org.jfree.date.SerialDate 441 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; продолжение 441 442 Приложение Б . org.jfree.date.SerialDate листинг Б .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 /* ======================================================================== 2 * JCommon : библиотека классов общего назначения для платформы Java(tm) 3 * ======================================================================== 4 * 5 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. 36 */ 37 package org.jfree.date; 38 39 import java.io.Serializable; 40 import java.util.*; 41 42 /** 43 * Абстрактный класс, представляющий неизменяемые даты с точностью 44 * до одного дня. Реализация отображает дату на целое число, представляющее 45 * смещение в днях от фиксированной точки отсчета. 46 * 47 * Почему не использовать java.util.Date? Будем использовать, где это имеет смысл. 48 * Класс java.util.Date бывает *слишком* точным - он представляет момент 49 * времени с точностью до 1/100 секунды (при этом сама дата зависит от часового 50 * пояса). Иногда бывает нужно просто представить конкретный день (скажем, 51 * 21 января 2015), не заботясь о времени суток, часовом поясе и т.д. 52 * Именно для таких ситуаций определяется класс DayDate. 53 * 54 * Для создания экземпляра используется DayDateFactory.makeDate. 55 * 56 * @author Дэвид Гилберт 57 * @author Роберт С. Мартин провел значительную переработку. 58 */ 59 60 public abstract class DayDate implements Comparable, Serializable { 61 public abstract int getOrdinalDay(); 62 public abstract int getYear(); 442 |