如何编写没有Java副作用的程序?

时间:2011-12-05 13:27:38

标签: java scala functional-programming

作为一名长期的Java程序员,近年来Haskell成瘾者,我现在正在学习Scala。我的问题是:

如何在Java中没有副作用进行编程?

即。我怎样才能手动完成Scala为我做的事情?

Odersky的Scala书经常用OO术语解释功能概念(例如val = final,if = ternary op。)。

是否有可访问的指南如何编写没有Java副作用的程序(尽可能少)?我想可以通过简单的旧java和一些规则来获得许多已知的好处(例如,不可修改的集合,最终值,不修改对象/应用程序状态的严格方法)。

4 个答案:

答案 0 :(得分:12)

  1. 将每个方法,字段和类设为abstractfinal
  2. 制作每个变量和方法参数final
  3. 如果您使用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中如果您想要可变IORefSTRef,则需要使用适当的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;

其余的是读者的练习;)