Java 我什么时候使用New来实例化一个类
我正在复习一个教程,老师似乎在掩饰一些毫无意义的东西 在Java中,如果我想实例化一个新的Gregorgian日期对象,我会使用: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);
GregorianCalendar gc= new GregorianCalendar (2010,1,14);
DateFormat df = DateFormat.getDateInstance();
但如果我希望使用数据格式对象,我会使用:
GregorianCalendar gc= new GregorianCalendar (2010,1,14);
DateFormat df = DateFormat.getDateInstance();
您应该经常查阅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
示例一致
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+中的类。看见