Java 在构造函数中初始化日历

Java 在构造函数中初始化日历,java,constructor,calendar,initialization,Java,Constructor,Calendar,Initialization,如果我这样做: new Estimacao("Aarão","Affenpinscher","Abóbora",new GregorianCalendar(1999,7,26),0), 一切正常。 但如果我这样做: new Estimacao("Aarão","Affenpinscher","Abóbora",new Calendar(1999,7,26),0), 这是可以做到的。据我所知。我们必须像这样初始化日历: Calendar date = Calendar.getInstance(

如果我这样做:

new Estimacao("Aarão","Affenpinscher","Abóbora",new GregorianCalendar(1999,7,26),0),
一切正常。 但如果我这样做:

new Estimacao("Aarão","Affenpinscher","Abóbora",new Calendar(1999,7,26),0),
这是可以做到的。据我所知。我们必须像这样初始化日历:

Calendar date = Calendar.getInstance();
date.set(Calendar.YEAR, 1999);
date.set(Calendar.MONTH, 7);
date.set(Calendar.DAY_OF_MONTH, 26);

我想知道的是,在如上所述创建和初始化对象时,是否可以使用
Calendar
,并实现与
GregoriaCalendar
相同的功能。

Calendar是一个抽象类,因此无法创建它的实例。当您调用getInstance时,它实际上返回一个新的GregoriaCalendar实例。因此,它与您的第一个示例相同

所以我想问题是,为什么你想叫新日历而不是新的公历?如果只是为了隐藏您正在使用的实现,那么我会做您已经做过的事情来初始化日历。或者创建一个方法,该方法采用相同的参数并隐藏对Calendar类的调用,例如

public Calendar getCalendar(int day, int month, int year) {
    Calendar date = Calendar.getInstance();
    date.set(Calendar.YEAR, year);

    // We will have to increment the month field by 1

    date.set(Calendar.MONTH, month+1);

    // As the month indexing starts with 0

    date.set(Calendar.DAY_OF_MONTH, day);

    return date;
}

使用适当的构造函数创建您自己的自定义类,并使用java Calendar类初始化您自己的Calendar类对象

Calendar
没有公共构造函数,并提供
Calendar.getInstance()
方法作为构造类实例的一种方法。如果需要参数化
Calendar
对象的构造,为什么不在类上编写一个helper方法呢

new Estimacao("Aarão","Affenpinscher","Abóbora", this.getCalendar(1999,7,26),0);

/* ...elided...other code in here */

private Calendar getCalendar(int year, int month, int day) {
    Calendar c = Calendar.getInstance()
    c.set(Calendar.YEAR, year);
    c.set(Calendar.MONTH, month);
    c.set(Calendar.DAY_OF_MONTH, day);
    return c;
}

日历不是抽象的,它只是没有公共构造函数。查看API,我想你会发现它是抽象的Calendar类是一个抽象类,它提供了一些方法,用于在特定的时间瞬间和一组日历字段(如年、月、月的日、小时等)之间进行转换,以及操作日历字段(如获取下一周的日期)。事实上,在Java7中是这样的。我在看旧的Java文档。看起来已经在Java7中变得抽象了。好吧,那么,我站出来更正。看起来我们提出了相同的解决方案。检查API,日历是抽象的