尝试实现从方法生成的UUID(随机唯一标识符)

时间:2017-07-27 15:33:29

标签: scala

scala新手,实现此方法的最佳方法是什么。我试图从下面的方法获取此值输出并将其分配给案例类。在OOP实践中有点生锈。

/** A container for storing car table fields */
case class car(
UUID??
color:String,
model:String,
type:String,
)

基本上我的问题是什么是为上面的案例类汽车创建以下兰特值的实例的最佳方法。创建另一个类并在同一个scala类中调用它或实现它?

  def rand = new Random()

def randomClockSeqAndNodeFields = {
var lsb: Long = 0
lsb |= 0x8000000000000000L // variant (2 bits)
lsb |= ( rand.synchronized { rand.nextLong } & 0x3FFFFFFFFFFFFFFFL)
lsb
}

2 个答案:

答案 0 :(得分:3)

我建议,因为UUID是java支持的类型:

/** A container for storing car table fields */
case class car(
uuid: UUID = UUID.randomUUID(),
color:String,
model:String,
type:String,
)

答案 1 :(得分:1)

组织此代码的一种方法是定义一个伴随对象:

object Car {
  def rand = new Random()

  def randomClockSeqAndNodeFields = { ... }
}

case class Car(
  UUID: Long = Car.randomClockSeqAndNodeFields,
  color: String,
  model: String,
  make: String
)

您可以在case类的声明中调用您的方法,默认情况下,将为该类的每个实例调用该方法。请注意,我将类名称大写以遵循标准命名约定,并将type重命名为make,因为type是关键字。

创建Car实例:

val myCar = Car(color="black", model="wrangler", make="jeep")

每个Car实例的创建,如果您没有明确传入UUID参数的值,将调用randomClockSeqAndNodeFields,为该汽车生成新的UUID。或者,您可以将Car定义为...

case class Car(
  UUID: Long,
  color: String,
  model: String,
  make: String
)

...在这种情况下,每次创建实例时都必须显式调用randomClockSeqAndNodeFields

val myCar = Car(Car.randomClockSeqAndNodeFields, "black", "wrangler", "jeep")