Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 纯函数和非纯函数的区别?_Java_Accessor - Fatal编程技术网

Java 纯函数和非纯函数的区别?

Java 纯函数和非纯函数的区别?,java,accessor,Java,Accessor,我假设纯函数必须始终具有返回类型(即不得为void),并且无论对象的状态如何,都必须具有相同的输出,并且不纯函数更改对象的状态或打印对象的状态 但我使用的教科书指出: 访问器通常包含一个return语句,但打印对象状态信息的方法也可能被归类为访问器 我很困惑。哪一个是正确的 编辑 澄清一下,让我问的是这个问题: 最后一个问题是“给出所使用的函数类型”,在那里发表评论的人说,这是一个不纯的函数,因为它是打印的 那么这个函数是纯的还是不纯的呢 根据定义,您似乎假设访问器是一个纯函数。这不一定是这样

我假设纯函数必须始终具有返回类型(即不得为
void
),并且无论对象的状态如何,都必须具有相同的输出,并且不纯函数更改对象的状态或打印对象的状态

但我使用的教科书指出:

访问器通常包含一个return语句,但打印对象状态信息的方法也可能被归类为访问器

我很困惑。哪一个是正确的

编辑

澄清一下,让我问的是这个问题:

最后一个问题是“给出所使用的函数类型”,在那里发表评论的人说,这是一个不纯的函数,因为它是打印的

那么这个函数是纯的还是不纯的呢

根据定义,您似乎假设访问器是一个纯函数。这不一定是这样的——访问器(甚至是返回值的
get
-访问器)可能是不纯的,例如处于访问顺序模式时的
get
方法(它将请求的条目移动到迭代顺序中的最后一个位置).

From-如果关于函数的这两个语句都成立,则函数可以被描述为纯函数

  • 给定相同的参数值,该函数始终计算相同的结果值。函数结果值不能依赖于任何隐藏信息或状态,这些信息或状态可能随着程序执行的进行或程序不同执行之间的变化而变化,也不能依赖于来自I/O设备的任何外部输入
  • 对结果的评估不会导致任何语义上可观察的副作用或输出,例如可变对象的突变或输出到I/O设备。
  • 因此,如果与代码相比,任何一条语句都是错误的,那么它就是不纯净的。

    这两条语句都是正确的

    创建用于获取值的方法时,这些方法称为访问器方法

    Ex:

    对于设置值,我们使用带有VOID的方法,这些方法称为变异方法

    Ex:


    不纯函数或变异方法会更改对象的状态,并修改存储在实例变量中的值。

    内容取自

    纯函数的特征:

  • 纯函数的返回值仅取决于其参数 因此,如果使用相同的参数集调用纯函数,您将始终获得相同的返回值

  • 它们没有任何副作用,如网络或数据库呼叫

  • 他们不会修改传递给他们的论点
  • 不纯函数的特征

  • 不纯函数的返回值不仅仅取决于其参数 因此,如果使用相同的参数集调用不纯函数,可能会得到不同的返回值 例如,Math.random(),Date.now()

  • 它们可能有任何副作用,如网络或数据库呼叫

  • 他们可以修改传递给他们的论点

  • 函数输入(值){
    返回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;
    }