Объяснение одноэлементных объектов в 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
Да, это в основном способ предоставления методов класса при использовании в качестве объекта-компаньона.