如何将第一个属性用于scala案例类的第二个属性

时间:2017-08-20 16:32:07

标签: scala case-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吗?感谢

2 个答案:

答案 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 _)