[英]Calling the instance of a static method
美好的一天!
我有点困惑。 我想使用日历,所以我在互联网上搜索它并遇到以下代码:
Ca1endar c = Calendar.getlnstance();
c.set(2011,2, 5,1,25);
但我了解到这是一种静态方法:
Calendar.getlnstance();
如果调用的方法是静态的,我怎么能得到日历实例(抽象类)?
我真的很想了解它。 所以下次我还可以创建一个可以创建实例的静态方法。
谢谢。
这是静态工厂方法。 想法是方法是调用构造函数的方法,它返回构造的对象。 Calendar.getInstance()
的主体可能是这样的:
return new SomeCalendar(now);
SomeCalender
是抽象类 Calendar
的具体实现。 一些优点是:您不必关心底层类(只要您知道它只是一个日历),并且底层实现可以在不影响您的情况下进行更改(例如,可以更改代码以return new AnotherCalendar()
,您不必更改代码中的任何内容)
由于它是一个静态方法,您可以在类型本身( Calendar.getInstance();
)上调用它,而不是该类型的实例( Calendar c = ...; c.getInstance();
)。
实例方法要求您已经有一个实例来调用该方法。
静态并不意味着您不能将实例作为参数,作为结果返回实例或创建实例。 它只是意味着,该方法可以,而不必首先一个实例调用,并在该方法中有没有这样的东西this
。
您通常不希望这种工厂方法成为实例方法(非静态),因为这意味着您需要已经有一个实例来创建一个新实例。 你会如何创建第一个?
(确实存在非静态工厂方法,但它们更常用于创建不同类型的对象。例如,Builder或Factory类通常会有一个方法来创建其他类的实例。)
Java在所有地方都做了这种事情。 查看XML API。
这是一种将单个接口维护到Calendar
系统的方法,即使底层实现已更改。 是的,该方法是一种工厂方法,但是,其他一些答案似乎错过的一点是它可以返回Calendar
不同实现。
即使它是抽象的,也可以返回Calendar。 getInstance()
过度简化实现可能是
Calendar getInstance()
{
return new GregorianCalendar();
}
getInstance()
的调用者不需要知道实现类型以获取当前日期和时间。
我建议通过OpenJDK查看
工厂方法是静态的这一事实并不能推断Calendar是静态的 - 它只是提供了一种创建Calendar的访问机制。
看看这篇关于如何自己使用这个模式的帖子: http : //today.java.net/pub/a/today/2005/03/09/factory.html
它还解释了模式背后的原理。
我的第二个建议是阅读有效的Java - 虽然它已经很老了,但这本书很棒!
它是在java中创建新对象的另一种方法。 传统的构造函数是可行的方法,但由于使用静态工厂有一些优点,因此它优于普通的vanilla构造函数。
你应该真的拿起Joshua Bloch的Effective Java。 这是本书的第一个项目。 优选静态工厂用于构造。 他提到的优点是:
1_由于静态工厂的名称可以是描述性的。
2_然后可以返回任何子类型,而不仅仅是特定类的类型。
3_您可以在工厂方法中处理缓存和单例等概念。 (您不必盲目创建新对象)。
4_减少初始化代码。 例如,我们可以使用类似getStringList()的方法来代替List newList = new ArrayList。
第四个优点是我不是很讲究,但我看到Google Guava框架已经实现了它。请拿起这本书。 它是java最好的编程书籍之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.