Java 纯函数和非纯函数的区别?
我假设纯函数必须始终具有返回类型(即不得为Java 纯函数和非纯函数的区别?,java,accessor,Java,Accessor,我假设纯函数必须始终具有返回类型(即不得为void),并且无论对象的状态如何,都必须具有相同的输出,并且不纯函数更改对象的状态或打印对象的状态 但我使用的教科书指出: 访问器通常包含一个return语句,但打印对象状态信息的方法也可能被归类为访问器 我很困惑。哪一个是正确的 编辑 澄清一下,让我问的是这个问题: 最后一个问题是“给出所使用的函数类型”,在那里发表评论的人说,这是一个不纯的函数,因为它是打印的 那么这个函数是纯的还是不纯的呢 根据定义,您似乎假设访问器是一个纯函数。这不一定是这样
void
),并且无论对象的状态如何,都必须具有相同的输出,并且不纯函数更改对象的状态或打印对象的状态
但我使用的教科书指出:
访问器通常包含一个return语句,但打印对象状态信息的方法也可能被归类为访问器
我很困惑。哪一个是正确的
编辑
澄清一下,让我问的是这个问题:
最后一个问题是“给出所使用的函数类型”,在那里发表评论的人说,这是一个不纯的函数,因为它是打印的
那么这个函数是纯的还是不纯的呢 根据定义,您似乎假设访问器是一个纯函数。这不一定是这样的——访问器(甚至是返回值的get
-访问器)可能是不纯的,例如处于访问顺序模式时的get
方法(它将请求的条目移动到迭代顺序中的最后一个位置).From-如果关于函数的这两个语句都成立,则函数可以被描述为纯函数:
不纯函数或变异方法会更改对象的状态,并修改存储在实例变量中的值。内容取自 纯函数的特征:
函数输入(值){
返回Math.random()*值;
}
函数pureFunc(值){
返回值*值;
}
var输入输出=[];
对于(变量i=0;i<5;i++){
输入输出推力(输入(5));
}
var pureOutput=[];
对于(变量i=0;i<5;i++){
push(pureFunc(5));
}
console.log(“不纯结果:+不纯输出);//结果不一致,但输入相同。
log(“纯结果:+pureOutput);//结果与相同的输入一致
我一直听说“accessor”被用作“getter”的同义词:一个基本上只返回一个值的函数,可能先进行一些状态检查。但是这个概念与纯度是正交的,所以我不太确定你说的这个问题是什么意思。假设函数子集上有一个属性(“纯函数必须有一个返回类型”),然后在完全不同的函数子集上声明另一个属性,然后询问哪个是正确的。没有什么能阻止两者的正确性(除了我从来没有听说过访问器的定义);我想说不是。纯度问题似乎仍然是正交的,从你的问题来看,你似乎已经知道了这一部分的答案Re“打印对象状态信息的方法也可能被归类为访问器。”-教科书是错误的<代码>访问器将信息返回给调用者-它们不使用“边带”通信(在本例中为打印)将信息从对象获取到其他地方。印刷是一种副作用;它不会被视为“访问”/“访问”数据。请注意,图像中的示例代码不会编译:access()
声明为返回Void
类型的实例,但其主体不会。此外,这个例子违反了java命名约定,因为它规定类名称应该用PascalCase来写。我个人认为打印诊断或跟踪输出不能语义上可观察到。这就是为什么我不愿意以这样或那样的方式发表关于打印任何内容的声明,也不愿意从维基百科链接中补充您的答案。printf()是不纯的,因为它会导致I/O设备的输出产生副作用。他正在打印-System.out.println时,似乎函数不纯净
public String getName(){
return this.name;
}
public void setName(String n){
this.name=n;
}