когда использовать одноэлементные объекты и когда использовать реальные объекты в Scala - PullRequest
3 голосов
/ 05 августа 2011

Хотелось бы узнать, есть ли какое-то конкретное правило или есть практическое правило, которому нужно следовать при использовании реальных объектов в scala против одноэлементных объектов в scala

скажи, что у меня есть такой класс

class GetDataInput {
 def getNameInput() {
 println("Enter the name value: ")
}
 def getTypeInput() {
   println("Enter the type value: ")
  }
 def getBothInput() {
   println("Enter the name value: ")
  println("Enter the type value: ")
 }
}

лучше ли использовать его в обычных терминах, таких как

val someval = new GetDataInput()
someval.getNameInput()

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

object GetDataInput {
  def getNameInp() = getNameInput()
}

Есть какие-нибудь указатели на это?

Ответы [ 3 ]

4 голосов
/ 05 августа 2011

Как правило, вы создаете object, когда:

  • Нет абсолютно никакого смысла иметь разные экземпляры потенциального класса, например, заключать в себя несколько чистых функций (например, математических функций)., фабричные методы)

  • Вы хотите написать эквивалент метода java static или static final констант.(см. Сопутствующие объекты).

  • Требуется более простая альтернатива для значений перечисления (sealed trait, расширенная * экземплярами object).

В вашем примере все функции чистые, а класс не имеет состояния.Поэтому все случаи будут строго равны.Имеет смысл превратить его в объект:

object GetDataInput {
  def getNameInput() {
    println("Enter the name value: ")
  }
  ...
}

Если вы сделали неправильный выбор, не беспокойтесь, его легко реорганизовать.Обычно вы можете сохранить все существующие вызовы объекта, просто извлекая методы в признаке:

trait GetDataInput {
   def getNameInput() {
    println("Enter the name value: ")
  }
}

object GetDataInput extends GetDataInput //Bring all traits methods into the object
                                         // to keep previous behaviour

class MyGetDataInput( whatever: Foo ) extends GetDataInput {
   ...
}
3 голосов
/ 05 августа 2011

Вопрос скорее такой: «Вам нужны разные экземпляры типа?» Если это так, то пойти на класс (или черта), если не пойти на синглтон. И между прочим, нет конкретных указаний для языка, который вы используете, только потому, что в него встроен шаблон синглтона.

2 голосов
/ 05 августа 2011

В scala одним из основных видов использования объектов является выполнение роли синглетонов.Если вы хотите использовать класс в качестве одиночного, просто объявите сам класс как объект.Тогда вы можете сделать:

GetDataInput.getNameInput()

Внутри scala будет лениво создавать один экземпляр вашего класса и поддерживать его в течение всей программы, поэтому каждый раз, когда вы вызываете метод объекта,действительно вызывает методы одноэлементного экземпляра класса, управляемого средой выполнения Scala.

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