Java 我什么时候使用New来实例化一个类

Java 我什么时候使用New来实例化一个类,java,instantiation,Java,Instantiation,我正在复习一个教程,老师似乎在掩饰一些毫无意义的东西 在Java中,如果我想实例化一个新的Gregorgian日期对象,我会使用: GregorianCalendar gc= new GregorianCalendar (2010,1,14); DateFormat df = DateFormat.getDateInstance(); 但如果我希望使用数据格式对象,我会使用: GregorianCalendar gc= new GregorianCalendar (2010,1,14);

我正在复习一个教程,老师似乎在掩饰一些毫无意义的东西

在Java中,如果我想实例化一个新的Gregorgian日期对象,我会使用:

GregorianCalendar gc= new GregorianCalendar (2010,1,14);
DateFormat df = DateFormat.getDateInstance();
但如果我希望使用数据格式对象,我会使用:

GregorianCalendar gc= new GregorianCalendar (2010,1,14);
DateFormat df = DateFormat.getDateInstance();
  • 我很想理解为什么dateformat不遵循实例化类的第一种方法

  • 我怎么知道将来会出现类似的问题呢


  • 您应该经常查阅API文档,了解如何使用它

    A
    new X()
    始终创建一个新对象,因此,如果您有多个需要它的位置,那么最终会出现多个X,如果一个X就可以了,那么这可能会导致效率低下

    .getDateInstance()
    调用是一个工厂,它允许API自行决定是向多个调用方返回相同的X,还是向每个调用方返回一个新的X。对于非常昂贵但可重用/共享的对象,这是获得它们的典型方式


    日历API很久以前就被捐赠给Java了,它的设计并没有那么好。现在,java中“我在Calendar和/或java.util.Date方面遇到问题X”的典型响应是使用设计良好的Joda库。对于使用Java 8或更高版本的新代码,请使用Basil Bourque评论的新Java.time类。

    简而言之,核心Java API设计糟糕且不一致。这些不一致通常没有很好的理由,你只需要接受它们

    更一般地说,工厂方法(如
    DateFormat.getDateInstance()
    )允许API根据情况选择不同的实现类,而直接使用构造函数意味着没有这种灵活性

    顺便说一句,除非您特别想要
    GregorianCalendar
    ,否则建议使用
    Calendar.getInstance()
    ,如果您的语言环境合适,它将返回
    GregorianCalendar
    。其他地区将返回不同的
    日历
    实现。这将与您的
    DateFormat
    示例一致

  • 这是因为它是一个抽象类。更多信息可在此处找到:

  • 同样,看看一个类是否是抽象的

  • 答案是正确的。这里还有一些想法

    避免遗留日期时间类 是与最早版本的Java捆绑在一起的糟糕的日期时间类之一,由不了解日期时间处理的人设计

    这些类在几年前就被现代的java.time类所取代。
    gregorianalendar
    类被替换为

    不变类 time类的设计目的是,使它们成为

    这意味着您永远不会使用
    new
    。相反,调用工厂方法。阅读关于这个问题的文章

    让我们通过特定地区(时区)的人们使用的挂钟时间捕捉当前时刻。我们调用
    ZoneDateTime.now
    来捕捉当前时刻。如中所示,
    zoneDateTime
    的构造函数标记为
    private
    ,以防止我们通过
    new
    进行实例化。在该类内部,工厂方法执行
    new
    。您可以自己查看,在源代码中搜索
    newzoneDateTime

    ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
    ZonedDateTime zdt = ZonedDateTime.now( z ) ;
    
    顺便说一下,如果必须使用
    gregoriacalendar
    与尚未更新为java.time的旧代码进行互操作,则可以转换。请参见添加到旧类的新转换方法

    ZonedDateTime zdt = myGregCal.toZonedDateTime() ;
    
    ……还有

    GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;
    


    getDateInstance()
    是DateFormat的一种静态方法,除了在给定的区域设置中尝试使用给定的时间和/或日期样式创建DateFormat外,它的工作几乎相同,并将检查它实例是否已创建,从而避免额外的工作。查看DateFormat的源代码以了解详细信息@Peter:我没有说是,那只是我在最后加的一个便条。我在第二段中解释了不同之处。更新:该项目现在在,它的创建者,已经开始领导定义内置于Java8+中的类。看见