2016-12-14 49 views
2

在表slick documentation列与def为什么列表中的表格是defs而不是vals?

class Coffees(tag: Tag) extends Table[(String, Int, Double, Int, Int)](tag, "COFFEES") { 
    def name = column[String]("COF_NAME", O.PrimaryKey) 
    def supID = column[Int]("SUP_ID") 
    def price = column[Double]("PRICE") 
    def sales = column[Int]("SALES", O.Default(0)) 
    def total = column[Int]("TOTAL", O.Default(0)) 
    def * = (name, supID, price, sales, total) 
} 

确定是否有一个原因,它不应该是这样的:

class Coffees(tag: Tag) extends Table[(String, Int, Double, Int, Int)](tag, "COFFEES") { 
    val name = column[String]("COF_NAME", O.PrimaryKey) 
    val supID = column[Int]("SUP_ID") 
    val price = column[Double]("PRICE") 
    val sales = column[Int]("SALES", O.Default(0)) 
    val total = column[Int]("TOTAL", O.Default(0)) 
    val * = (name, supID, price, sales, total) 
} 

好像列不使用任何可能改变。

回答

3

简短回答: 初始化顺序。

龙答:

让我们收集一些事实:

1)使用val!而非defš大部分工作(如果你在你的代码大部分def S更改为val的IT将最的时间表现正确 - 至少这是它是如何工作的)

2)Slick代码的大部分示例使用def s。

因此,如果发生了错误,它可能会发生在一些(罕见的)情况下。

一些光可以通过这部分代码在Slick本身散出(看看评论后if(tt == null)(类`RelationalProfile):

def column[C](n: String, options: ColumnOption[C]*)(implicit tt: TypedType[C]): Rep[C] = { 
     if(tt == null) throw new NullPointerException(
     "implicit TypedType[C] for column[C] is null. "+ 
     "This may be an initialization order problem. "+ 
     "When using a MappedColumnType, you may want to change it from a val to a lazy val or def.") 
     new Rep.TypedRep[C] { 
     override def toNode = 
      Select((tableTag match { 
      case r: RefTag => r.path 
      case _ => tableNode 
      }), FieldSymbol(n)(options, tt)) :@ tt 
     override def toString = (tableTag match { 
      case r: RefTag => "(" + _tableName + " " + r.path + ")" 
      case _ => _tableName 
     }) + "." + n 
     } 
    } 

如果你看一看提交介绍了这种变化: https://github.com/slick/slick/commit/be2ff6513d46abc9a25c8752c2931a786d4c5ad6

你应该找到相当不错的解释(提交评论)