我知道如果方法有副作用,我应该按惯例使用()
def method1(a: String): Unit = {
//.....
}
//or
def method2(): Unit = {
//.....
}
如果方法没有副作用但是它不是纯粹的,没有任何参数,当然,每次调用它时会返回不同的结果,我是否必须做同样的事情?
def method3() = getRemoteSessionId("login", "password")
答案 0 :(得分:1)
作为任何类型的访问器(封装字段或逻辑属性)的方法应该在没有括号的情况下声明,除非它们有副作用。
除了访问者之外,它没有提及任何其他用例。所以问题归结为你是否认为这个方法是一个访问者,而这又取决于如何设置类的其余部分,也许还取决于(预期的)呼叫站点。
答案 1 :(得分:1)
编辑:在回顾了Luigi Plinge的评论之后,我开始认为我应该重写答案。这也不是一个明确的是/否答案,而是一些建议。
首先:关于var
的案例很有意思。声明var foo
会为您提供一个不带括号的getter foo
。显然这是一个不纯的调用,但它没有副作用(它不会改变调用者未观察到的任何内容)。
第二,关于你的问题:我现在不会说getRemoteSessionId
的问题是它不纯,但实际上它让服务器为你维护一些会话登录,所以很明显你会破坏性地干扰环境。然后,由于这种副作用,method3()
应该用括号写成。
第三个例子:获取目录的内容因此应该写成file.children
而不是file.children()
,因为它再次是一个不纯的函数,但不应该有副作用(除了读取之外)只能访问您的文件系统)。
第四个例子:鉴于上述情况,你应该写System.currentTimeMillis
。我倾向于来编写System.currentTimeMillis()
但是......
使用这个案例,我的初步答案是:当函数有副作用时,括号是最好的;或者如果它是不纯的,取决于不受您的计划控制的州。
根据这个定义,getRemoteSessionId
是否已知副作用并不重要。另一方面,它意味着恢复写file.children()
...