Подтвердить что ты не робот

Если синглтоны настолько плохи, почему у Scala есть поддержка языков для них?

Возможный дубликат:
Почему объекты с одноэлементным объектом больше ориентированы на объекты?

Почему у Scala есть поддержка языка для анти-шаблона Singleton? Если Scala унаследовал ключевое слово static от Java, какие допустимые варианты использования ключевого слова object остались бы?

4b9b3361

Ответ 1

Существует, по крайней мере, разность фронта, поскольку object в Scala на самом деле является объектом (т.е. экземпляром), а не на Java, где это просто методы, вызываемые самим классом.

Это означает, что он избегает одной из основных жалоб о синглтонах - поскольку это экземпляр, он может быть передан и подключен к методам и поэтому может быть заменен для других реализаций во время тестов и т.д. Если что-нибудь синтаксическое сахара для рекомендуемой альтернативы синглонам - с классом с методом getInstance(), возвращающим стандартный экземпляр по умолчанию.

Тем не менее, я считаю, что анти-шаблон Singleton больше связан с дизайном, чем с языковыми функциями. Если вы структурируете свою базу кода таким образом, чтобы какая-то монолитная зависимость неявно была подключена к большинству классов, тогда у вас будут проблемы с ее изменением - независимо от особенностей языка.

В Scala существуют допустимые варианты использования objects (например, используя case objects для сообщений для Актеров или несколько из них расширяют sealed trait как альтернатива перечислениям ). Функция языка может быть нарушена, но, на мой взгляд, она менее непримирима, чем Java static, и более полезна.

Ответ 2

Синглеты без состояния не так уж плохи. Я вижу объекты (в scala) в качестве модулей для размещения функций (поведения).

Ответ 3

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

object StringSerializer extends Serializer[String] {
  // Implementation goes here.
}

В этом случае нет необходимости обновлять экземпляр Serializer, что упрощает кодекс и, вероятно, повышает производительность.

Ответ 4

Например, типы классов. Разница между статическими классами и синглтонами заключается в том, что синглтоны являются объектами и могут передаваться как параметры. Этот код, например, не может быть построен со статическими классами:

trait TypeClass[A] {
  def method(x: A): A
}

implicit object IntTypeClass extends TypeClass[Int] {
  def method(x: Int) = x*x
}

def foo[A](x: A)(implicit tc: TypeClass[A]) = tc.method(x)

scala> foo(2)
res0: Int = 4