作为一名长期的Java程序员,近年来Haskell成瘾者,我现在正在学习Scala。我的问题是:
如何在Java中没有副作用进行编程?
即。我怎样才能手动完成Scala为我做的事情?
Odersky的Scala书经常用OO术语解释功能概念(例如val = final,if = ternary op。)。
是否有可访问的指南如何编写没有Java副作用的程序(尽可能少)?我想可以通过简单的旧java和一些规则来获得许多已知的好处(例如,不可修改的集合,最终值,不修改对象/应用程序状态的严格方法)。
答案 0 :(得分:12)
abstract
或final
。final
。Array
等可变结构,或者文件和数据库连接等i / o资源,请不要让它们逃避构造它们的范围。答案 1 :(得分:9)
请参阅Functional Java。
答案 2 :(得分:7)
在没有较少副作用的情况下进行编程的一种方法是仅使用immutable类。 您可以将此应用于您自己的类,但如果不从头开始重写,则无法更改标准Java运行。
无论如何,使Java副作用免费,没有任何意义,因为它是一种具有OO数据封装的命令式编程语言。换句话说,副作用是语言的一部分,本身并不邪恶。
答案 3 :(得分:5)
作为一名长期的Java程序员,近年来Haskell成瘾者,我现在正在学习Scala。
恭喜:)
如何在没有Java副作用的情况下编程?即我如何手动完成Scala为我做的事情?
嗯,在强制执行或协助副作用自由风格方面,Scala对你(与Haskell相比)并没有那么多。例如,您始终可以让Scala中的选项在任何地方使用var
,而在Haskell中如果您想要可变IORef
或STRef
,则需要使用适当的monad。
换句话说,虽然你问如何在Java中模仿Scala样式,但要考虑的第一步是如何在Scala中模仿Haskell样式,这当然是Scalaz发挥作用的地方。
所有这一切,我认为你大多回答了你自己的问题:
我想可以通过简单的旧java和一些规则获得许多已知的好处(例如,不可修改的集合,最终值,不修改对象/应用程序状态的严格方法)。
纪律至少是故事的一半。简单地使用final
和不可变集合(àlaGuava)会对代码最终结果产生各种影响。当然,故事的另一半是当你的程序需要副作用(例如I / O)时你会怎么做?在Haskell中你使用IO
monad,在Scala中你可以选择使用scalaz.effects.IO
,但在Java中,说实话,我认为这不是一场值得战斗的战斗。
在我看来,您将在任何Java程序中编写的两个最重要的功能样式代码行如下:
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.transform;
其余的是读者的练习;)