调用静态方法的实例

时间:2011-03-05 05:26:37

标签: java static

美好的一天!

我有点困惑。我想使用日历,所以我在互联网上搜索它并遇到以下代码:

Ca1endar c = Calendar.getlnstance();
c.set(2011,2, 5,1,25);

但我了解到这是一种静态方法:

Calendar.getlnstance();

如果调用的方法是静态的,我怎么能得到日历实例(抽象类)?

我真的很想了解它。所以下次我还可以创建一个可以创建实例的静态方法。

谢谢。

5 个答案:

答案 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的最佳编程书之一。