【发布时间】:2018-06-08 09:12:13
【问题描述】:
我在 Scala 中有以下代码来使用 JDBC 访问数据库。它工作得很好,但是它使用了几个可变变量(var 声明),因为这些变量需要在 finally 子句中可用才能关闭 JDBC 元素。可以将此代码更改为仅使用不可变变量(val 声明)吗?
var connection:Connection = null
var statement:Statement = null
var resultSet:ResultSet = null
try {
val url = "someUrl"
val user = "someUser"
val password = "somePwd"
Class.forName("mySql")
connection = DriverManager.getConnection(url, user, password)
statement = connection.createStatement()
resultSet = statement.executeQuery("SELECT column FROM table")
while ( resultSet.next() ) {
val col = resultSet.getString(1)
println(col)
}
}
catch {
case e:Exception => e.printStackTrace
}
finally {
if (resultSet != null) resultSet.close
if (statement != null) statement.close
if (connection != null) connection.close
}
【问题讨论】:
-
在您查看了以下答案后,请考虑 Martin Odersky 的书 (lirmm.fr/~ducour/Doc-objets/scalabook.pdf) 的第 27 页; “面向对象和函数式编程的融合体现在 Scala 的许多不同方面。这两种编程风格具有互补优势”..
-
FP 在没有副作用的情况下最强,使用 jdbc 驱动程序从根本上涉及状态。这会导致您在上面的示例中观察到的那种挫败感/挑战。许多人将 jdbc 驱动程序的有状态特性封装起来,并在其顶部放置一个 FP 抽象;比如光滑的 db api (slick.lightbend.com)。就个人而言,我喜欢在这一点上进行声明,但这是另一个话题。
标签: scala functional-programming