2013-08-08 4 views
4

Поскольку мое изучение Скалы продолжается, меня заинтриговали некоторые из вариантов на языке Scala. Рассмотрим удаление статических классов. В мире Java (откуда я пришел) существует четкое различие между статическим элементом, синглом и членом экземпляра. Всегда существовала постоянная потребность в синглете на Java, с которым статический член не мог реально помочь. Основные случаи использования, которые я знаю, почему одноэлемент может быть предпочтительнее статического элемента:Lazy Singleton in Scala

  1. Возможность управления экземпляром одноэлементного объекта. Если загрузка экземпляра класса является ресурсом тяжелым, мы хотим оттолкнуть его позже, пока он не понадобится.
  2. Возможность конфигурировать одноэлементный объект во время выполнения. Представьте, что вам нужно читать переменные окружения и заполнять наш синглтон во время построения. Это невозможно сделать, если элемент статичен, поскольку информация не может быть известна во время загрузки класса.

Похоже, что реализация синглтона Scala будет лишена вышеупомянутых преимуществ. Посмотрите на обсуждение здесь: http://pbadenski.blogspot.com/2009/06/design-patterns-in-scala-singleton.html

Мне кажется, что не Скала разрешает использование одноразовых чехлов вообще. Это было бы разочарованием.

Если мое понимание верное, тогда возникает следующий вопрос: Как включить ленивый одноэлементный шаблон в Scala?

Похоже, нам нужно сражаться с scala, чтобы получить однотонный правильный путь!

PS: Это не мой блог

+0

Что такое «проблема с одиночкой»? – pedrofurla

+0

Кроме того, я использую Scala с 2008 года и никогда не помню создание экземпляров «объектов» во время загрузки класса. – pedrofurla

+0

Мне нравится ваш вопрос (он выдает несколько хороших ответов), но я не буду его голосовать, потому что, как написано, он пытается ответить сам, и я не согласен с вашим заключением. –

ответ

18

Singletons в Scala ленивы. Попробуйте следующее в вашем РЕПЛ:

scala> object Foo { println("hello") } 
defined module Foo 

scala> 1+1 
res0: Int = 2 

scala> Foo 
hello 
res1: Foo.type = [email protected] 

scala> Foo 
res2: Foo.type = [email protected] 

Как вы можете видеть из Println, Foo не инициализирован, пока он не используется.