gpt4 book ai didi

Scala 最佳实践 : Trait Inheritance vs Enumeration

转载 作者:行者123 更新时间:2023-12-01 20:25:42 34 4
gpt4 key购买 nike

我目前正在尝试 Scala 并寻找最佳实践。我发现自己有两种相反的方法来解决一个问题。我想知道哪个更好,为什么,哪个更传统,以及您是否知道其他一些更好的方法。第二个对我来说看起来更漂亮。

<强>1。基于枚举的解决方案

import org.squeryl.internals.DatabaseAdapter
import org.squeryl.adapters.{H2Adapter, MySQLAdapter, PostgreSqlAdapter}
import java.sql.Driver

object DBType extends Enumeration {
val MySql, PostgreSql, H2 = Value

def fromUrl(url: String) = {
url match {
case u if u.startsWith("jdbc:mysql:") => Some(MySql)
case u if u.startsWith("jdbc:postgresql:") => Some(PostgreSql)
case u if u.startsWith("jdbc:h2:") => Some(H2)
case _ => None
}
}
}

case class DBType(typ: DBType) {
lazy val driver: Driver = {
val name = typ match {
case DBType.MySql => "com.mysql.jdbc.Driver"
case DBType.PostgreSql => "org.postgresql.Driver"
case DBType.H2 => "org.h2.Driver"
}
Class.forName(name).newInstance().asInstanceOf[Driver]
}
lazy val adapter: DatabaseAdapter = {
typ match {
case DBType.MySql => new MySQLAdapter
case DBType.PostgreSql => new PostgreSqlAdapter
case DBType.H2 => new H2Adapter
}
}
}

<强>2。基于单例的解决方案

import org.squeryl.internals.DatabaseAdapter
import org.squeryl.adapters.{H2Adapter, MySQLAdapter, PostgreSqlAdapter}
import java.sql.Driver

trait DBType {
def driver: Driver
def adapter: DatabaseAdapter
}

object DBType {
object MySql extends DBType {
lazy val driver = Class.forName("com.mysql.jdbc.Driver").newInstance().asInstanceOf[Driver]
lazy val adapter = new MySQLAdapter
}

object PostgreSql extends DBType {
lazy val driver = Class.forName("org.postgresql.Driver").newInstance().asInstanceOf[Driver]
lazy val adapter = new PostgreSqlAdapter
}

object H2 extends DBType {
lazy val driver = Class.forName("org.h2.Driver").newInstance().asInstanceOf[Driver]
lazy val adapter = new H2Adapter
}

def fromUrl(url: String) = {
url match {
case u if u.startsWith("jdbc:mysql:") => Some(MySql)
case u if u.startsWith("jdbc:postgresql:") => Some(PostgreSql)
case u if u.startsWith("jdbc:h2:") => Some(H2)
case _ => None
}
}
}

最佳答案

如果您声明一个密封特征DBType,您可以通过详尽检查对其进行模式匹配(即,如果您忘记了一种情况,Scala 会告诉您)。

无论如何,我不喜欢 Scala 的枚举,而且我并不是唯一一个这样做的人。我从不使用它,如果有什么东西枚举确实是最简洁的解决方案,那么最好使用 Java 的枚举来用 Java 编写它。

关于Scala 最佳实践 : Trait Inheritance vs Enumeration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7700507/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com