是否可以重写另一类中的一个类的方法?

时间:2019-03-17 20:57:52

标签: java string oop calendar tostring

是否可以通过另一个类重写另一个类中的toString()方法,所以您不必重写整个类就可以重写一个方法?例如,我想用以下这段代码重写Calendar类中的toString()方法:

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 个答案:

答案 0 :(得分:2)

允许我提出另一种方法。

从用户界面中分离模型和业务逻辑。日期属于您的模型。日期的字符串表示形式属于该接口。

在模型中,使用LocalDate作为日期。在任何情况下都不得求助于旧的CalendarDateSimpleDateFormat。这些课程设计不佳,而且已经过时。

在界面中,使用DateTimeFormatter将模型中的LocalDate格式化为适合用户的字符串。首选使用内置的本地化格式,而不是使用格式模式字符串来构建自己的格式。

有时候,最好使用toString方法创建一个对象,该对象给出适合呈现的字符串。例如,如果要在JList中显示对象,可能就是这种情况。在这种情况下,将业务对象包装在UI对象中,例如:

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);
    }

}

请仅将此类保留在您的UI代码中。例如,如果模型需要选择日期,则从LocalDate中取出PresentableDate,然后仅将LocalDate传递回模型。 PresentableDate与路易斯·瓦瑟曼(Louis Wasserman)建议的{em>装饰器类似。in a comment。它遵循关于继承的构成原则。

并且仅为了证明toString方法有效:

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

输出:

  

19-03-18

链接

答案 1 :(得分:0)

是的,您可以通过在名为CoolGregorianCalendar的子类中扩展GregorianCalendar.java来为GregorianCalendar完成一个不同的“ toString”功能。

扩展类将使您可以重写Object#toString方法并提供所需的任何String。

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

从oracle文档中进一步了解继承。

,您还可以在
上进一步了解有关重写Object#toString的信息 -https://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#toString%28%29