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