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