Объяснение одноэлементных объектов в Scala

Я получаю кодирование в том, что вы в основном предоставляете "объект SomeClass" и "класс SomeClass", а класс-компаньон - это объявление класса, а объект - singleton. Вы не можете создать экземпляр. Итак... мой вопрос в основном заключается в цели объекта singleton в этом конкретном случае.

Это просто способ предоставить методы класса в Scala? Как методы + в Objective-C?

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

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

Я не помню, чтобы читать где-либо Программирование на веб-сайте Scala, что Java является предварительным условием для чтения этой книги...

Ответ 1

Да, сопутствующие сингллеты предоставляют эквивалент статическим методам Java (и С++, С# и т.д.).

(действительно, методы сопутствующих объектов отображаются через "статические экспедиторы" для взаимодействия с Java)

Однако, синглтоны идут справедливо за этим.

  • Singleton может наследовать методы из других классов/признаков, которые не могут быть выполнены со статикой.
  • Singleton может передаваться как параметр (возможно, через наследуемый интерфейс)
  • Синтаксис может существовать в рамках окружающего класса или метода, так же как Java может иметь внутренние классы
  • Также стоит отметить, что одноэлемент не обязательно должен быть компаньоном, он отлично подходит для определения одноэлементности, не определяя также класс-компаньон.

Это помогает сделать Scala гораздо более объектно-ориентированным языком, который Java (статические методы не принадлежат объекту). Иронично, учитывая, что он в значительной степени обсуждается с точки зрения его функциональных полномочий.

Ответ 2

Во многих случаях для обеспечения уникального объекта в нашей программной системе нам нужен синглтон. Подумайте о солнечной системе. Мы можем иметь следующие классы

class Planet
object Earth extends Planet
object Sun extends Planet

объект - это простой способ создания singleton, конечно, он обычно используется для создания метода уровня класса, как статического метода в java

Ответ 3

Дополнительно к данным ответам (и в том же общем направлении, что и jilen), object играют важную роль в механизме Scala implicit, например. позволяя поведение типа типа (как известно из 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(_,_))

Теперь мы имеем a 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

So object очень полезны сами по себе.

Но подождите, больше! Объекты Companion также могут служить своего рода "конфигурацией по умолчанию" при расширении своего класса-компаньона:

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, когда вы хотите пойти с настройками по умолчанию.

Ответ 4

Да, это в основном способ предоставления методов класса при использовании в качестве объекта-компаньона.