java - 纯方法必须是静态的吗?
问题描述
我目前正在阅读一本教科书,该教科书将纯方法定义为:
“一种仅依赖于其参数而不依赖于其他数据的静态方法”
实例方法不可能是纯方法而不是静态的(只要它不修改参数并且没有像打印这样的“副作用”)?
我知道纯方法是纯方法,返回值仅取决于参数而不取决于任何其他状态,因此调用实例方法的方式可能意味着从调用该方法的对象中获取的变量不算作参数,但作为另一个“状态”?
除此之外,我想不出非静态方法不能成为纯方法的任何原因。
这是一个例子:
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 中的方法引用可以以这种方式运行,使第一个参数成为调用该方法的对象本身。
推荐阅读
- javascript - 为什么 document.getElementById('foo').value 不是参考?
- twilio -
TwiML 响应的标记 - java - 调整 Lucene 评分
- java - SQLite 中的日期类型
- angular - ngModel,使用取消选项更新子组件中的值
- tensorflow - Tensorflow:张量必须来自与张量相同的图
- javascript - 无法获得关于何时使用 applescript 调用 jquery 的正确时机
- db2 - 通过 pentaho 将数据从 csv 输入到 db2 中的 sql 表
- algorithm - 在数组中找到三个数字的算法,使得 a< b < c 和 v[a]
给定一个整数向量,我需要找出向量中是否存在三个元素
a, b, c
,使得a < b< c
和v[a] < v[c] < v[b]
。到目前为止,我的方法如下。首先,我忘记了 a 并为向量中的每个数字找到位于该元素左侧的 v[i] 的最小值。我将此
- java - 有没有办法在运行时更改 java 方法的访问修饰符?