2017-07-27 37 views
0

scala的新功能,實現此方法的最佳方式是什麼。我試圖從下面的方法中獲取這個值並將其分配給一個case類。在OOP實踐中生鏽。嘗試實現從方法生成的UUID(隨機唯一標識符)

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

Basicaly我的問題什麼是最好的方法來創建一個實例的以下蘭特價值案例類汽車上面。創建另一個類並在相同的Scala類中調用它或實現它?

def rand = new Random() 

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

你說的是創建隨機'UUID'? –

+0

@YuvalItzchakov是,然後讓它分配給UUID int類案例類車 –

+2

'java.util.UUID.randomUUID'是要走的路。 –

回答

1

一種方法是定義一個同伴對象:

object Car { 
    def rand = new Random() 

    def randomClockSeqAndNodeFields = { ... } 
} 

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

你可以打電話給你的方法在您的案例類的聲明中,並且該方法默認情況下會針對該類的每個實例調用。請注意,我將類名稱大寫爲遵循標準命名約定,因此typemake,因爲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") 
3

我建議,既然UUID是一個Java支持的類型:舉辦這個代碼

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