Объяснение одноэлементных объектов в Scala - PullRequest
35 голосов
/ 01 июля 2011

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

Является ли это просто способом предоставления методов класса в Scala?Как и + основанные на методах в Objective-C ?

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

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

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

Ответы [ 4 ]

55 голосов
/ 01 июля 2011

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

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

Однако синглтоны выходят далеко за рамки этого.

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

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

14 голосов
/ 01 июля 2011

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

class Planet
object Earth extends Planet
object Sun extends Planet

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

4 голосов
/ 01 июля 2011

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

2 голосов
/ 01 июля 2011

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

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