【问题标题】:Java - class name in method declaration where the return type should beJava - 方法声明中的类名,返回类型应该是
【发布时间】:2015-08-11 19:53:37
【问题描述】:

我正在编写一些代码,其中有一个看起来像这样的方法:

    public static ProcessorClass getProcessor(String x, int y) {
     return(var);
    }

根据我的记忆,“ProcessorClass”是一个返回类型,但这意味着什么。 “ProcessorClass”是该方法当前所在的类。我对这意味着什么感到困惑。

【问题讨论】:

  • 这意味着它返回一个ProcessorClass 实例。返回同一类的实例的类上的方法没有任何问题。

标签: java class methods


【解决方案1】:

检查这个例子:

public class Ploop
{
    int x;

    private Ploop()
    {
        x = 0;
    }

    public static Ploop getInstance()
    {
        return new Ploop();
    }
}

在这种情况下,getInstance() 函数是获取新 Ploop 对象的唯一方法。如果构造函数是public,那么会有两种方式,new Ploop()Ploop.getInstance()

这会让事情更清楚吗?

【讨论】:

  • 您是否有理由要在构造函数上创建方法?
  • 一个原因是如果你正在实现一个单例。然后构造函数只被调用一次,并且函数不断返回相同的实例。通常(总是?)单例类有一个私有构造函数,因此它可以强制只有一个实例。
  • 另一个原因可能是类自己构建(如在构建器模式中)并且build() 方法返回构建的实例。
【解决方案2】:

当方法使用类名作为其返回类型时,返回对象类型的类必须是返回类型的子类或确切类。

假设您有一个类层次结构,其中 ImaginaryNumber 是 java.lang.Number 的子类,而后者又是 Object 的子类,如下所示。

                        Object
                          |
                        Number
                          |
                     ImaginaryNumber

现在假设您有一个声明为返回数字的方法:

public Number returnANumber() {
    ...
}

returnANumber 方法可以返回 ImaginaryNumber 但不能返回 Object。 ImaginaryNumber 是一个数字,因为它是 Number 的子类。但是,对象不一定是数字——它可以是字符串或其他类型。

您可以覆盖一个方法并将其定义为返回原始方法的子类,如下所示:

public ImaginaryNumber returnANumber() {
    ...
}

这种称为协变返回类型的技术意味着允许返回类型与子类在同一方向上变化。

【讨论】:

    【解决方案3】:

    本质上,返回类型可以是任何东西,如果方法返回一些东西的话。您可以返回定义该方法的同一类的实例。

    ProcessorClass 这里是一个返回类型。您正在返回该类的一个实例。

    例如。

    class ProcessorClass {
     public ProcessorClass someMethod() {
      return new ProcessorClass();
     }
    }
    

    这里方法返回的类型与类相同。

    class XYZ {
     pubic ProcessorClass anotherMethod() {
      return new ProcessorClass();
     }
    }
    

    这里的方法是返回上面的类类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多