我创建了一个这样的案例类:
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吗?感谢
答案 0 :(得分:1)
两种选择:
创建一个对象来保存像列名这样的静态内容并将它们用作变量:
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))
仍然使用对象,但这次使用抽象类和2个案例类。请注意,在实例化时,您不必指定列名。
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
部分。
答案 1 :(得分:1)
这样的事情可能是:
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 _)