2017-02-22 112 views
0

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

Если у меня есть этот объект:

case object StartMessage 

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

class Test2 { 
    def print(){ 
    println(Integer.toHexString(System.identityHashCode(StartMessage))) 
    } 
} 


class Test1 { 
    def print(){ 
    println(Integer.toHexString(System.identityHashCode(StartMessage))) 
    } 
} 

, как ожидаемый результат:

object ActorMain extends App{ 
    new Test1().print()//45c8e616 
    new Test2().print()//45c8e616 
} 

Но когда я изменить случай объекта, чтобы упаковать его в черта:

trait model{ 
    case object StartMessage 
} 

тогда мои классы будут иметь декларацию как:

class Test1 extends model{ 
class Test2 extends model{ 

я получаю:

45c8e616 
7d417077 

* 1 , Не могли бы вы объяснить мне это? Я думал, что объекты являются единым целым приложением, поэтому, когда я создаю Trait с объектами в нем, каждый раз, когда я буду расширять (используйте «с») эти черты, объект будет таким же, а не в некоторой степени.

* 2. Есть ли другой способ получить функциональность для «добавления» одних и тех же объектов только с расширением черты к конкретным классам и не сделать их видимыми для всего приложения? Дело в том, чтобы иметь более чистый код с возможностью «маркировать» классы как «они используют эти объекты, в то время как другие не делают»

+1

Объекты не являются одиночными для приложения, а скорее в пределах их объявленного объема. В большинстве примеров используется «объект» в области пакета, который эффективно привязан к приложению. –

ответ

2

Объекты, определенные в пределах признака, представляют собой одноточие с учетом области видимости. Фактически это относится к экземпляру признака, а не к самому признаку. И получившееся поведение - это тот, который вы видите -> объекты создаются для каждого экземпляра. И это приводит к выводу, что вы не можете определять объекты, расширяя черты, которые должны быть разделены между разными классами. Некоторое время назад был аналогичный вопрос о SO, я постараюсь найти его позже.

Лично я хотел бы перейти к занятиям в качестве своего рода контекста для предоставления общих ресурсов.