首页 > 解决方案 > 纯方法必须是静态的吗?

问题描述

我目前正在阅读一本教科书,该教科书将纯方法定义为:

“一种仅依赖于其参数而不依赖于其他数据的静态方法”

实例方法不可能是纯方法而不是静态的(只要它不修改参数并且没有像打印这样的“副作用”)?

我知道纯方法是纯方法,返回值仅取决于参数而不取决于任何其他状态,因此调用实例方法的方式可能意味着从调用该方法的对象中获取的变量不算作参数,但作为另一个“状态”?

除此之外,我想不出非静态方法不能成为纯方法的任何原因。

这是一个例子:

public class Rational {

    private int numer;
    private int denom;

    public Rational() {
        this.numer = 0;
        this.denom = 1;
    }

    public Rational(int numer, int denom) {
        this.numer = numer;
        this.denom = denom;
    }
}

上面定义了一个Rational

然后,您可以在类中编写一个方法,该方法通过下面的“方法一”或“方法二”Rational返回一个Rational对象。double

方法一:

public double toDouble() {
    double x = this.numer;
    double y = this.denom;
    double fprat = x / y;
    return fprat;
}   

方法二:

public static double toDouble(Rational rational)
{
    double x = rational.numer;
    double y = rational.denom;
    double fprat = x / y;
    return fprat;
} 

它们本质上做的事情完全相同,但一个是静态方法,另一个是实例方法,因此它们的调用将采用不同的格式。方法二当然是纯方法,但非静态的方法一在这种情况下也能定义为纯方法吗?

标签: javasemantics

解决方案


该定义的“静态”部分是多余的。静态方法并不能保证它不依赖任何其他状态。我怀疑该定义只是想确保该方法不使用实例变量。

另一方面,从技术上讲,您也可以将实例方法视为具有第零个参数的静态方法,即对象本身。如果该对象是不可变的(或者该方法没有改变对象中的任何内容),您可能会争辩说该方法仍然是纯的。基本上,您将“对象”视为附加参数。

例如,Java 中的方法引用可以以这种方式运行,使第一个参数成为调用该方法的对象本身。


推荐阅读