【发布时间】:2018-11-01 03:18:54
【问题描述】:
我目前正在阅读一本教科书,该教科书将纯方法定义为:
“一个静态方法,只依赖于它的参数而不依赖其他数据”
实例方法不可能是纯方法而不是静态的(只要它不修改参数并且没有像打印这样的“副作用”)?
我知道纯方法是纯方法,返回值仅取决于参数而不取决于任何其他状态,因此调用实例方法的方式可能意味着从调用方法的对象中获取的变量不' t 算作参数,但算作另一个“状态”?
除此之外,我想不出非静态方法不能成为纯方法的任何原因。
这是一个例子:
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;
}
它们本质上做的事情完全相同,但一个是静态方法,另一个是实例方法,因此它们的调用格式不同。方法二当然是纯方法,但是在这种情况下,非静态的方法一也可以定义为纯方法吗?
【问题讨论】:
-
我想是的。如果您在 Java 类中有一个“纯”静态方法,那么您只需删除
static,它的依赖关系理论上不会改变。 -
如果从架构的角度来看,将纯方法作为实例方法是不合逻辑的。它是纯粹的,因为它没有状态并且是幂等的,所以它可能应该是一个静态方法
-
如果方法不是静态的,那么您将传递一个隐式的
this参数。并且参数的要求也必须适用于隐式this参数。 -
谁能提供一些建议,告诉我如何编辑这个问题而不是“主要基于意见”?我试图询问常见 Java 术语的基本定义,而不是人们对它们的看法。到目前为止,我感谢所有答案,并继续自己寻求澄清。我目前正在阅读有关纯方法和构造函数的 JML 部分。如果有人感兴趣,你可以在这里找到。 eecs.ucf.edu/~leavens/JML/jmlrefman/jmlrefman_7.html#SEC60
-
@Yassin 绝对允许纯方法接受状态作为输入(否则将毫无意义)。为什么隐藏的 this 指针应该被认为比函数的任何其他参数更特殊?这个论点导致了一个矛盾:假设
public static int pureFunc(MyInstance self)是纯的,显然同构public int pureFunc()也是纯的。