2013-12-10 1 views
1

Я хочу сохранить время, когда я создаю экземпляр объекта.Scala - сохранить время создания при создании переопределенных объектов

с помощью следующего кода, время изменяется каждый раз, когда я хочу знать CreationDate:

class MyClass() 

class DatedClass(myClass: MyClass) { 
    val creationDate: Long = System.currentTimeMillis() 
} 

implicit def CachedWrapperClassifier(myClass: MyClass) = { 
    new DatedClass(myClass) 
} 

val obj = new MyClass 
println(obj.creationDate) 
Thread.sleep(1000) 
println(obj.creationDate) 

Обе указанные даты не равны ... любая идея, почему !?

Спасибо заранее!

UPDATE:

Во-первых, спасибо за ваши ответы!

Я хочу, чтобы выбрать решение Trait, но это больше не работает, если я хочу использовать метод разнесенных для получения объекта ...

trait CreationTime { 
    val creationTime: Long = System.currentTimeMillis() 
} 

class MyClass() 

def getMyClass: MyClass = { 
    new MyClass with CreationTime 
} 

val obj = getMyClass 
println(obj.creationTime) // creationTime is not accessible 
Thread.sleep(1000) 
println(obj.creationTime) 

Но я не могу коснуться «MyClass».

Любая идея, как решить эту проблему?

+0

scala - это статически типизированный язык, если вы избавитесь от типа, один из способов вернуть его - путем литья. println (obj.asInstanceOf [CreationTime] .creationTime) –

ответ

2

Ваш компилятор заменит ваши вызовы на creationDate с неявным преобразованием. Чтобы вызвать метод, компилятор создаст новый объект-обертку для каждого вызова до creationDate. То, что компилятор имеет тот же эффект, выполнив следующие действия:

val obj = new MyClass 
println(new DatedClass(obj).creationDate) 
Thread.sleep(1000) 
println(new DatedClass(obj).creationDate) 

Поскольку конструктор вызывается дважды, даты создания различны.

+0

Благодарим вас за быстрый ответ! Итак, я вижу ... мммх ... любая идея, как я могу избежать этого? Я хочу переопределить MyClass, но я не хочу каждый раз иметь новый экземпляр! :/ – snessarb

+0

Я не знаю, как обойти это. Я думаю, что вы не можете отслеживать время создания без изменения MyClass или вызова конструктора. Особенность, которую предложил Йеспер, - это один из способов сделать это, но нет никакого неявного способа. – tmbo

1

obj - неявная конверсионная оболочка, поэтому каждый раз, когда вы ее используете, вы получаете новый экземпляр.

если добавить Println вы увидите, что происходит

class DatedClass(myClass: MyClass) { 
    println("new instance") 
    val creationDate: Long = System.currentTimeMillis() 
} 
3

Один из способов сделать это по-другому является использование признака как Mixin:

trait CreationDate { 
    val creationDate: Long = System.currentTimeMillis() 
} 

val obj = new MyClass with CreationDate 
println(obj.creationDate) 
Thread.sleep(1000) 
println(obj.creationDate) 
+0

Ницца и просто! Спасибо! :) – snessarb

2

Я думаю, что вы, вероятно, хотите используйте признак, который упростит ваш код:

trait CreateTime { 
    val createTime: Long = System.currentTimeMillis() 
} 

Вы можете прикрепить его к своему классу либо путем его расширения в определении класса:

class MyClass() extends CreateTime 

Или при создании объекта:

val obj = new MyClass with CreateTime 

Кроме того, обратите внимание на ваши имена переменных. То, что вы назвали creationDate, действительно не является датой ... это время (или временная метка). Важно, чтобы ваши имена переменных были четкими.

+0

Да, thx для tipp относительно имен переменных. Вы абсолютно правы. – snessarb

Смежные вопросы