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

777             case SerialDate.PRECEDING : return "Preceding";

778             case SerialDate.NEAREST : return "Nearest";

779             case SerialDate.FOLLOWING : return "Following";

780             default : return "ERROR : Relative To String";

781         }

782

783     }

784

785     /**

786      * Метод-фабрика, возвращающий экземпляр конкретного субкласса

787      * {@link SerialDate}.

788      *


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

789      * @param day  день (1–31).

790      * @param month  месяц (1–12).

791      * @param yyyy  год (в диапазоне от 1900 до 9999).

792      *

793      * @return Экземпляр {@link SerialDate}.

794      */

795     public static SerialDate createInstance(final int day, final int month,

796                                             final int yyyy) {

797         return new SpreadsheetDate(day, month, yyyy);

798     }

799

800     /**

801      * Метод-фабрика, возвращающий экземпляр конкретного субкласса

802      * {@link SerialDate}.

803      *

804      * @param serial  порядковый номер дня (1 января 1900 = 2).

805      *

806      * @return экземпляр SerialDate.

807      */

808     public static SerialDate createInstance(final int serial) {

809         return new SpreadsheetDate(serial);

810     }

811

812     /**

813      * Метод-фабрика, возвращающий экземпляр субкласса SerialDate.

814      *

815      * @param date  объект даты Java.

816      *

817      * @return экземпляр SerialDate.

818      */

819     public static SerialDate createInstance(final java.util.Date date) {

820

821         final GregorianCalendar calendar = new GregorianCalendar();

822         calendar.setTime(date);

823         return new SpreadsheetDate(calendar.get(Calendar.DATE),

824                                    calendar.get(Calendar.MONTH) + 1,

825                                    calendar.get(Calendar.YEAR));

826

827     }

828

829     /**

830      * Возвращает порядковый номер для даты, где 1 January 1900 = 2 (что почти

831      * соответствует системе нумерации, используемой в Microsoft Excel for

832      * Windows и Lotus 1-2-3).

833      *

834      * @return порядковый номер даты.

835      */

836     public abstract int toSerial();

837

838     /**

839      * Возвращает java.util.Date. Поскольку java.util.Date превосходит SerialDate

840      * по точности, необходимо определить схему выбора ‘времени суток’.

841      *

842      * @return текущий объект в виде java.util.Date.

843      */

844     public abstract java.util.Date toDate();

845

846     /**

847      * Возвращает описание даты.

848      *

849      * @return описание даты.

850      */

851     public String getDescription() {

852         return this.description;

853     }

854

855     /**

856      * Задает описание даты.

857      *

858      * @param description  новое описание даты.

859      */

860     public void setDescription(final String description) {

861         this.description = description;

862     }

863

864     /**

865      * Преобразует дату в строку.

866      *

867      * @return  строковое представление даты.

868      */

869     public String toString() {

870         return getDayOfMonth() + "-" + SerialDate.monthCodeToString(getMonth())

871                                + "-" + getYYYY();

872     }

873

874     /**

875      * Возвращает год (в действительном диапазоне от 1900 до 9999).

876      *

877      * @return год.

878      */

879     public abstract int getYYYY();

880

881     /**

882      * Возвращает месяц (январь = 1, февраль = 2, март = 3).

883      *

884      * @return месяц.

885      */

886     public abstract int getMonth();

887

888     /**


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

889      * Возвращает день месяца.

890      *

891      * @return день месяца.

892      */

893     public abstract int getDayOfMonth();

894

895     /**

896      * Возвращает день недели.

897      *

898      * @return день недели.

899      */

900     public abstract int getDayOfWeek();

901

902     /**

903      * Возвращает разность (в днях) между текущей и заданной

904      * 'другой' датой.

905      * 

906      * Результат положительный, если текущая дата следует после 'другой',

907      * или отрицателен, если текущая дата предшествует 'другой'.

908      *

909      * @param other  дата для сравнения.

910      *

911      * @return разность между текущей и другой датой.

912      */

913     public abstract int compare(SerialDate other);