You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Все объекты являются одиночками (Singleton Object) - то есть существуют в единственном экземпляре. Он создается лениво, когда на него ссылаются, также как ленивые значения (lazy val).
12
13
13
14
На самом верхнем уровне объект является одиночкой.
14
15
15
16
Как член класса или как локальная переменная, он ведет себя точно так же как ленивое значение (lazy val).
17
+
16
18
# Объявление одиночного объекта
19
+
17
20
Объект - является значением. Объявление объекта происходит схожим с классом образом, но используется ключевое слово `object`:
Метод `info` может быть импортирован в любом месте программы. Создание подобных методов является распространенным вариантом использования одиночных объектов.
31
64
32
65
Давайте посмотрим, как использовать `info` в другом пакете:
info("Created projects") // Prints "INFO: Created projects"
96
+
```
97
+
98
+
{% endtab %}
99
+
100
+
{% endtabs %}
101
+
46
102
Метод `info` виден благодаря указанию импорта `import logging.Logger.info`.
103
+
Для импорта требуется "постоянный путь" к импортируемому символу, а путь к объекту неизменен.
47
104
48
-
Замечание: Если `object` не является объектом верхнего уровня, но вложен в другой класс или объект, то объект, как и любой другой член, "зависим от пути".
105
+
Замечание: Если `object` не является объектом верхнего уровня, но вложен в другой класс или объект,
106
+
то объект, как и любой другой член, "зависим от пути".
107
+
Это означает, что для двух видов напитков, `class Milk` и `class OrangeJuice`,
108
+
элемент класса `object NutritionInfo` "зависит" от включающего его экземпляра, будь то `Milk` или `OrangeJuice`.
109
+
`milk.NutritionInfo` полностью отличается от `oj.NutritionInfo`.
49
110
50
111
## Объекты компаньоны
51
112
52
113
Объект с тем же именем, что и класс называется _объект компаньон_ (companion object). И наоборот, класс является классом-компаньоном объекта. Класс или объект компаньон может получить доступ к приватным членам своего спутника. Используйте объект компаньон для методов и значений, которые не специфичны для экземпляров класса компаньона.
Класс `Circle` имеет член `area`, который специфичен для каждого конкретного экземпляра, а метод `calculateArea` одиночного объекта `Circle`, доступен для каждого экземпляра класса `Circle`.
71
161
72
162
Объект компаньон может также содержать методы создающие конкретные экземпляры класса спутника:
caseNone=> println("Error: could not parse email")
211
+
```
212
+
213
+
{% endtab %}
214
+
215
+
{% endtabs %}
216
+
95
217
`object Email` содержит производящий метод `fromString`, который создает экземпляр `Email` из строки. Мы возвращаем результат как `Option[Email]` на случай возникновения ошибок парсинга.
96
218
97
219
Примечание: Если у класса или объекта есть компаньон, они должны быть размещены в одном и том же файле. Чтобы задать компаньонов в REPL, либо определите их на той же строке, либо перейдите в режим `:paste`.
98
220
99
-
## Примечания для Java-программистов ##
221
+
## Примечания для Java-программистов
100
222
101
223
`static` члены в Java смоделированы как обычные члены объекта компаньона в Scala.
102
224
103
225
При использовании объекта компаньона из Java-кода, члены будут определены в сопутствующем классе компаньоне с `static` модификатором. Это называется _пробрасывание статики_. Такое происходит, даже если вы сами не определили класс компаньон.
226
+
227
+
## Дополнительные ресурсы
228
+
229
+
- Узнайте больше об объектах компаньонах в [Scala Book](/scala3/book/domain-modeling-tools.html#companion-objects)
0 commit comments