В дополнение к данным ответам (и в том же направлении, что и jilen), object
s играют важную роль в механизме implicit
в Scala, например, разрешение поведения типа класса (как известно из Haskell):
trait Monoid[T] {
def zero:T
def sum(t1:T, t2:T):T
}
def fold[T](ts:T*)(implicit m:Monoid[T]) = ts.foldLeft(m.zero)(m.sum(_,_))
Теперь у нас есть fold
-функция. который «сворачивает» несколько T
с, при условии, что есть Monoid
(вещи, которые имеют нейтральный элемент и могут быть как-то «добавлены» вместе) для T
. Чтобы использовать это, нам нужен только один экземпляр Monoid
для некоторого типа T
, идеальная работа для object
:
implicit object StringMonoid extends Monoid[String] {
def zero = ""
def sum(s1:String, s2:String) = s1 + s2
}
Теперь это работает:
println(fold("a","bc","def")) //--> abcdef
Так что object
очень полезны сами по себе.
Но подождите, это еще не все! Сопутствующие объекты также могут служить своего рода «конфигурацией по умолчанию» при расширении своего сопутствующего класса:
trait Config {
def databaseName:String
def userName:String
def password:String
}
object Config extends Config {
def databaseName = "testDB"
def userName = "scott"
def password = "tiger"
}
Итак, с одной стороны, у вас есть черта Config
, которая может быть реализована пользователем так, как он хочет, но с другой стороны, есть готовый объект Config
, когда вы хотите перейти с настройками по умолчанию .