繁体   English   中英

调用静态方法的实例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM