2010-12-08 2 views
3

Можно создать дубликат:
val and object inside a scala class?объекты в Scala полей

Есть ли существенная разница между:

class Foo { 
    object timestamp extends java.util.Date 
} 

и

class Foo { 
    val timestamp = new java.util.Date {} 
} 

Что значит иметь класс с полем объекта? Для чего они используются? Существуют ли ситуации, когда вы должны использовать объект?

Спасибо ...

+1

Возможный дубликат http://stackoverflow.com/questions/3448691/val-and-object-inside-a-scala-class – 2010-12-08 21:09:08

ответ

6

Использование object может быть предпочтительным, если вам необходимо добавить поведение в поле. Например:

class Foo { 
    object startDate extends java.util.Date { 
     def isBusinessDay: Boolean = // ... 
    } 
} 

class Bar { 
    lazy val startDate = new java.util.Date { 
     def isBusinessDay: Boolean = // ... 
    } 
} 

Тип foo.startDate является foo.startDate.type, а вызов метода foo.startDate.isBusinessDay будет решен статический.

Тип bar.startDate, с другой стороны, является структурным типом java.util.Date{ def isBusinessDay: Boolean }. Таким образом, вызов bar.startDate.isBusinessDay будет использовать рефлексию и нести излишнюю служебную нагрузку.

2

Те же ведут себя в основном одинаково. Я предположил, что class X { object Y ... } просто предоставит пространство имен для X.Y. Я использовал Y для хранения (постоянных) данных утилиты, связанных с X именно потому, что я ожидал одного уникального X.Y. Фактически, для каждого нового X, который я обнаружил при выполнении профилирования памяти, был создан один новый объект.

5

Два отличия, один важный, один тонкий. Во-первых, объекты лениво инициируются. Для ваших целей это означает, что ваш второй пример должен быть

class Foo { 
    lazy val timestamp = new java.util.Date {} 
} 

для них, чтобы вести себя эквивалентно. Более тонко, каждый объект имеет свой собственный уникальный тип. В случае вашего примера timestamp будет иметь тип Foo.timestamp.type. Обычно это не важно на практике, но может вызвать неожиданности, если вы обращаетесь к объектам.

+0

Выбор нитей немного, не так ли, что в любом случае, timestamp имеет уникальный тип, но в объектном случае тип предсказуем, а в случае val это некоторый тип анонов? – 2010-12-08 21:29:50

+0

Хорошо, глядя на ваш другой ответ, кажется, что мы видим, что поля объектов - это код, который предшествует ленивому val. Я бы сказал, что ленивый вал почти всегда предпочтительнее. – 2010-12-08 21:33:13