Ответ 1
Позвольте вызвать класс class SomeClass
(хотя он может также быть, например, a trait
).
Частные члены
Способы объекта-компаньона (object SomeClass
) имеют доступ к закрытым методам/данным экземпляров class SomeClass
.
Если ваш объект-компаньон использует только открытый интерфейс вашего класса (например, просто определяет константы), нет никакой практической разницы. Но есть ряд случаев, когда полезно, чтобы функции полезности получали доступ к закрытым членам. Например, object SomeClass
может определить метод factory apply
, который устанавливает частные члены class SomeClass
, не подвергая сеттерам в открытом интерфейсе. В таких случаях вы должны определить объект-компаньон, поставив определение object SomeClass
в том же компиляционном блоке, что и class SomeClass
.
Другое отличие состоит в том, что компилятор ищет implicits в сопутствующих объектах типа (и его супертипов). Поэтому, если вы используете неявные преобразования, которые вы определяете в коде class SomeClass
, вы должны определить их в сопутствующем объекте.
Комментарии
Комбинация этих двух также объясняет одно и то же ограничение единицы компиляции.
-
scalac
не может скомпилироватьobject SomeClass
, пока не узнает, какие частные членыclass SomeClass
он вызывает. -
scalac
не может скомпилироватьclass SomeClass
, пока не узнает, какие вызовы он вызывает. Поэтому объект-компаньон должен быть скомпилирован не позднееclass SomeClass
.
Следовательно, они должны быть скомпилированы в одно и то же время. Кроме того, текущий компилятор, по-видимому, компилирует отдельные файлы отдельно (например, отсутствие поддержки для разделения классов по нескольким файлам), ограничивая его одним и тем же компилятором.