为什么可以声明一个返回正在创建的同一类的类型的方法?

时间:2017-11-11 08:09:10

标签: java class methods

我看到了下一堂课:

public static class DetailsFragment extends Fragment {

    public static DetailsFragment newInstance(int index) {
        DetailsFragment f = new DetailsFragment();

        // Supply index input as an argument.
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);

        return f;
    }
}

我不明白为什么你可以返回DetailsFragment类型,即使你只是定义了DetailsFragment是什么。对我来说(新手),就像在字典中搜索单词一样,定义使用单词本身来定义它。

请解释一下。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

构造函数与静态工厂方法

newInstance方法上的static modifier是关键。该修饰符将方法定义为独立,只需将代码自行运行,而不是定义属于对象(实例)的行为。

静态方法是 object-oriented的Java部分之一。长话短说,有时只需运行一大块代码而不将其绑定到对象就很方便。

如果遵循常见的Java命名约定,其中一个类以初始的大写字符命名,并且该类的实例以初始小写字母命名,那么您可以轻松地发现静态方法的调用。

DetailsFragment.newInstance()  // A static method call made on a class. Not object-oriented.
detailsFragment.someMethod()  // Instance method, invoked on one instance (one object) of type DetailsFragment named 'detailsFragment'.

因此,您的newInstance方法不是构造函数方法。 喜欢构造函数方法,因为它旨在创建一个对象。这种方法有时被称为工厂方法。

你的思路是正确的。为同一个类调用new的构造函数会导致无限循环的对象创建一个创建对象的对象,依此类推,直到您的应用程序执行失败。这种对自身的重复调用称为recursion。如果不受控制,递归是不好的,导致您的应用程序失败。工厂方法的递归也会以同样的方式变坏,无休止地运行直到失败。

但是我们有一个工厂方法通过调用new来调用构造函数。所以,没有不受控制的递归,根本没有递归。

如果您对这些概念不熟悉,那么将它们包裹起来可能会很棘手。对我来说,关键是当我的眼睛使用static修饰符时,我认为"不是面向对象的"并将我的大脑从OOP模式转移出来,转而考虑简单的程序代码。

在视觉上,我认为一个类是一个cookie切割器,对象/实例是正在生成的cookie,静态方法是一个由字符串绑定到cookie切割器的注释。这个静态方法实际上与类无关,但是将它绑定到类给了我们一个可以保存的地方,这是我们以后查找和调用该方法的一种方式。