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

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

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

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

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

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

4 ответа

Решение

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

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

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

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

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

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

class Planet
object Earth extends Planet
object Sun extends Planet

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

В дополнение к данным ответам (и в том же направлении, что и Джилен), objectиграют важную роль в Скала 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(_,_))

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

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

Другие вопросы по тегам