Можно ли переопределить метод одного класса в другом классе? - PullRequest
0 голосов
/ 17 марта 2019

Можно ли переопределить метод toString () в другом классе через другой класс, чтобы вам не приходилось переписывать весь класс только для того, чтобы вы могли переписать один метод?Например, я хочу переписать метод toString () в классе Calendar с помощью следующего сегмента кода:

public String toString() {
    Date date = getTime();
    DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
    return dateFormat.format(date);
}

, чтобы он возвращал что-то вроде

17/03/2019

вместоедва читаемая строка типа,

java.util.GregorianCalendar[time=1552855726815,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=2,WEEK_OF_YEAR=12,WEEK_OF_MONTH=4,DAY_OF_MONTH=17,DAY_OF_YEAR=76,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=48,SECOND=46,MILLISECOND=815,ZONE_OFFSET=-18000000,DST_OFFSET=3600000]

Если нет, могу ли я предложить несколько советов о том, как написать метод для выполнения чего-то похожего на это?

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

Позвольте мне предложить другой подход.

Отделите вашу модель и бизнес-логику от вашего пользовательского интерфейса. Даты принадлежат вашей модели. Строковые представления дат принадлежат интерфейсу.

В вашей модели используйте LocalDate для дат. Ни в коем случае не прибегайте к старым Calendar, Date и SimpleDateFormat. Эти классы плохо разработаны и давно устарели.

В вашем интерфейсе используйте DateTimeFormatter для форматирования LocalDate из модели в строку, подходящую для пользователя. Предпочитайте использовать встроенные локализованные форматы, а не создавать свои собственные из строки шаблона формата.

Иногда хорошо иметь объект с методом toString, который дает строку, подходящую для представления. Это может быть, например, случай, если мы хотим представить наши объекты в JList. В этом случае оберните ваши бизнес-объекты в объекты пользовательского интерфейса, например, так:

public class PresentableDate {

    private static final DateTimeFormatter dateFormatter = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.SHORT)
            .withLocale(Locale.CANADA_FRENCH);

    LocalDate date;

    public PresentableDate(LocalDate date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return date.format(dateFormatter);
    }

}

Только, пожалуйста, сохраните этот класс в своем коде пользовательского интерфейса. Например, если модели требуется выбранная дата, возьмите LocalDate из PresentableDate и передайте только LocalDate обратно модели. PresentableDate сродни декоратору , который Луи Вассерман предложил в комментарии . Он следует принципу «1028 * композиция по наследованию» .

И просто для демонстрации того, что метод toString работает:

    System.out.println(new PresentableDate(LocalDate.now(ZoneId.of("America/Toronto"))));

Выход:

19-03-18

Ссылки

0 голосов
/ 18 марта 2019

Да, вы можете выполнить другую функцию 'toString' для GregorianCalendar, расширив GregorianCalendar.java в подклассе, называемом в этом примере CoolGregorianCalendar.

Расширение класса позволит вам переопределить метод Object # toString и предоставить любую строку, которую вы хотите.

Object # toString традиционно используется для краткого и информативного представления объекта в удобном для чтения виде. Рекомендуется, чтобы «все подклассы переопределяли этот метод».

Вот код для CoolGregorianCalendar.java

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;

public class CoolGregorianCalendar extends GregorianCalendar {

    @Override
    public String toString() {
        Date date = getTime();
        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        return dateFormat.format(date);
    }

}

Исходя из того факта, что он предназначен для уникальной идентификации этого объекта, два объекта могут быть созданы одновременно и дать одно и то же представление toString - но это проблема для вас:)

Вы можете прочитать подробнее о наследовании из документации оракула над @ https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

и вы также можете прочитать о переопределении Object # toString в
- https://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#toString%28%29

...