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

>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 /* ========================================================================

>   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  * до одного дня. Реализация отображает дату на целое число, представляющее