如何将第一个属性用于 scala case class 的第二个属性
how to use first attribute into second attribute from scala case class
我创建了一个这样的案例class:
case class MyClass[T](attName: String, getter: (ResultSet) => T)
我实例化了两个这样的例子:
val ex1 = MyClass("name", (rs: ResultSet) => rs.getString("name"))
val ex2 = MyClass("age", (rs: ResultSet) => rs.getInt("age"))
我想避免在每一行中使用两个时间名称和年龄。你有什么想法在第二个属性中重用 attName 吗?感谢
两个选择:
创建一个对象来保存列名等静态内容并将它们用作变量:
object MyClass {
object DbKeys {
val name = "name"
val age = "age"
}
}
case class MyClass[T](attName: String, getter: (ResultSet) => T)
val ex1 = MyClass(DbKeys.name, (rs: ResultSet) => rs.getString(DbKeys.name))
val ex2 = MyClass(DbKeys.age, (rs: ResultSet) => rs.getInt(DbKeys.age))
仍然是对象,但这次是抽象 class 和 2 个案例 classes。请注意,在实例化时不指定列名。
object MyClassArg {
object DbKeys {
val name = "name"
val age = "age"
}
}
abstract class MyClassArg[T](attName: String, getter: (ResultSet) => T)
case class MyClassName() extends MyClassArg(DbKeys.name, (rs: ResultSet) => rs.getString(DbKeys.name))
case class MyClassAge() extends MyClassArg(DbKeys.age, (rs: ResultSet) => rs.getString(DbKeys.age))
val ex1 = MyClassName
val ex2 = MyClassAge
我更喜欢第二种选择,因为它使用起来更干净。您可以使 MyClassArg
成为非抽象的以提供更大的灵活性。
getter
也可以进一步抽象,避免重复rs.getString
部分。
可能是这样的:
class MyClass[T](name: String, getter: (ResultSet, String) => T) {
def getIt(rs: ResultSet): T = getter(rs, name)
}
case object MyClassName extends MyClass[String]("name", _ getString _)
case object MyClassAge extends MyClass[Int]("age", _ getInt _)
或者只是
val ex1 = new MyClass("name", _ getString _)
val ex2 = new MyClass("age", _ getInt _)
我创建了一个这样的案例class:
case class MyClass[T](attName: String, getter: (ResultSet) => T)
我实例化了两个这样的例子:
val ex1 = MyClass("name", (rs: ResultSet) => rs.getString("name"))
val ex2 = MyClass("age", (rs: ResultSet) => rs.getInt("age"))
我想避免在每一行中使用两个时间名称和年龄。你有什么想法在第二个属性中重用 attName 吗?感谢
两个选择:
创建一个对象来保存列名等静态内容并将它们用作变量:
object MyClass {
object DbKeys {
val name = "name"
val age = "age"
}
}
case class MyClass[T](attName: String, getter: (ResultSet) => T)
val ex1 = MyClass(DbKeys.name, (rs: ResultSet) => rs.getString(DbKeys.name))
val ex2 = MyClass(DbKeys.age, (rs: ResultSet) => rs.getInt(DbKeys.age))
仍然是对象,但这次是抽象 class 和 2 个案例 classes。请注意,在实例化时不指定列名。
object MyClassArg {
object DbKeys {
val name = "name"
val age = "age"
}
}
abstract class MyClassArg[T](attName: String, getter: (ResultSet) => T)
case class MyClassName() extends MyClassArg(DbKeys.name, (rs: ResultSet) => rs.getString(DbKeys.name))
case class MyClassAge() extends MyClassArg(DbKeys.age, (rs: ResultSet) => rs.getString(DbKeys.age))
val ex1 = MyClassName
val ex2 = MyClassAge
我更喜欢第二种选择,因为它使用起来更干净。您可以使 MyClassArg
成为非抽象的以提供更大的灵活性。
getter
也可以进一步抽象,避免重复rs.getString
部分。
可能是这样的:
class MyClass[T](name: String, getter: (ResultSet, String) => T) {
def getIt(rs: ResultSet): T = getter(rs, name)
}
case object MyClassName extends MyClass[String]("name", _ getString _)
case object MyClassAge extends MyClass[Int]("age", _ getInt _)
或者只是
val ex1 = new MyClass("name", _ getString _)
val ex2 = new MyClass("age", _ getInt _)