Как создаются объекты Singleton и Companion, они экземпляры? - PullRequest
0 голосов
/ 16 июня 2020

Я читал, как можно использовать сопутствующие и одноэлементные объекты для c методов stati, что имеет смысл. Мой вопрос в том, как этот объект создан или его экземпляр? Я читал из некоторых источников о том, что объекты являются экземплярами класса, если используются в качестве сопутствующих объектов, в то время как другие говорят, что они не являются экземплярами класса. Тогда как объекты существуют или создаются? Плюс, я полагаю, объект будет иметь тот же тип данных класса?

Ответы [ 3 ]

3 голосов
/ 16 июня 2020

Мой вопрос в том, как этот объект создан или создан его экземпляр?

[…]

Тогда как объекты существуют или создаются?

Вы не знаете, не должны знать и не можете знать.

Спецификация языка Scala говорит, что они существуют. Спецификация языка Scala не говорит, как они создаются. Каждый разработчик может реализовать их так, как ему заблагорассудится. . Scala -native не зависит от какой-либо платформы, поэтому он может делать все, что захочет. Scala -JVM должен соответствовать ограничениям JVM, где каждый объект должен быть экземпляром класса. В Scala -JVM каждый одноэлементный объект Foo является экземпляром класса JVM с именем Foo$.

Плюс объект будет иметь тот же тип данных класса, как я полагаю?

Тип одиночного объекта Foo - это одиночный тип Foo.type. Это не класс.

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

Вместо того, чтобы читать «некоторые источники», гораздо лучше просто прочитать источник : Scala Спецификацию языка , в частности раздел 5.3.2 Классы case :

Определение класса case ? [tps] (ps 1 )… (ps ? ) с параметрами типа tps и параметрами значения ps подразумевает определение сопутствующего объекта, который служит объектом экстрактора. Он имеет следующую форму:

object ? {
  def apply[tps](ps1)…(ps?): ?[tps] = new ?[Ts](xs1)…(xs?)
  def unapply[tps](?: ?[tps]) =
    if (x eq null) scala.None
    else scala.Some(?.xs11,…,?.xs1?)
}
2 голосов
/ 16 июня 2020
  1. Каждый object имеет свой собственный класс, но вы не можете получить к нему доступ напрямую. У этого класса есть конструктор без параметров, который вызывается автоматически при загрузке и создает единственный экземпляр.

  2. Объекты являются экземплярами класса, если используются в качестве сопутствующих объектов

    Либо вы неправильно поняли, либо вам действительно не стоит доверять этим источникам. Сопутствующий объект может расширить черту / класс, до которого он является компаньоном, но это не совсем обычное явление.

0 голосов
/ 16 июня 2020

Сопутствующие объекты не являются экземплярами класса, которому они сопутствуют, воспринимайте их скорее как набор служебных методов. Если вы знакомы с Java - весь метод, который вы сделали static в Java (следовательно, они принадлежат не конкретному экземпляру, а классу в целом), будет go для объекта Companion в Scala. Кроме того, сопутствующие объекты имеют доступ к частным значениям классов.

Объекты инициализируются для вас лениво, вам не нужно знать, когда и как именно они создаются, просто если вы вызываете функцию из объекта - это будет создан для вас, и будет только один его экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...