我何时使用New实例化一个类

问题描述 投票:3回答:4

我只是在学习教程,而指导老师似乎掩盖了没有意义的内容

在Java中,如果我要实例化我将使用的新Gregorgian日期对象:

GregorianCalendar gc= new GregorianCalendar (2010,1,14);

但是如果我想使用数据格式对象,我会使用:

DateFormat df = DateFormat.getDateInstance();
  1. 我真的很想理解为什么dateformat不遵循实例化类的第一种方式?

  2. 我怎么知道将来要寻找类似的陷阱?

java instantiation
4个回答
5
投票
您应该始终查阅API文档,以了解如何使用它。

[C new X()总是创建一个新对象,因此,如果您有多个位置需要它,则最终会得到多个X,如果单个X可以这样做,则效率可能较低。

.getDateInstance()调用是

Factory,允许API自行决定是将相同的X甚至返回给多个调用方,还是返回一个新的X。对于非常昂贵但可重复使用/可共享的对象,这是获取它们的典型方法。

Calendar API是很久以前捐赠给Java的,其设计不尽人意。如今,对Java中“我在Calendar和/或java.util.Date中遇到问题X的问题”的典型响应是,使用

is

设计良好的Joda库。

3
投票
简短的回答是,核心Java API的设计不良且不一致。这些不一致通常没有充分的理由,您只需要忍受它们即可。

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

顺便说一句,除非您特别想要GregorianCalendar,否则建议的一种获取方法是Calendar.getInstance(),如果您的语言环境合适,则会返回GregorianCalendar。其他语言环境将返回不同的Calendar实现。这将与您的DateFormat示例一致。


1
投票
  1. 这是因为它是一个抽象类,可以在这里找到更多信息:http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
  2. 相同,请查看类是否为抽象。

0
投票
Answer by Thorbjørn Ravn Andersen是正确的。这里还有一些想法。

避免使用旧的日期时间类

GregorianCalendar是与最早的Java版本捆绑在一起的可怕的日期时间类之一。这些类在几年前被现代的[[java.time类所取代。 GregorianCalendar类专门替换为

不变的类别

java.time

类被设计为immutable,使它们成为thread-safe

这意味着您永远不会使用new。而是调用工厂方法。了解naming conventions on such methods

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

ZoneId z = ZoneId.of( "Africa/Tunis" ) ; ZonedDateTime zdt = ZonedDateTime.now( z ) ;

顺便说一下,如果必须使用GregorianCalendar与尚未更新为

java.time
的旧代码进行互操作,则可以进行转换。请参阅添加到旧类中的新转换方法。

ZonedDateTime zdt = myGregCal.toZonedDateTime() ; ...和...

GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;

Table of date-time types in Java, both modern and legacy

Table of which java.time library to use with which version of Java or Android
© www.soinside.com 2019 - 2024. All rights reserved.