scala - 何时使用单例对象以及何时在 scala 中使用实际对象

标签 scala functional-programming singleton

我想知道在 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()
}

对此有任何指示吗?

最佳答案

通常你在以下情况下创建一个object:

  • 拥有一个潜在类的不同实例绝对没有意义,例如,包含几个纯函数(如数学函数、工厂方法)

  • 您想编写等效于 java 的 static 方法或 static final 常量。 (请参阅伴随对象)。

  • 您想要一个更简单的枚举值替代方案(由 objectinstances 扩展的 sealed trait)。

在您的示例中,所有函数都是纯函数,并且类是无状态的。因此,所有实例都将严格相等。把它变成一个对象是有意义的:

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 {
   ...
}

关于scala - 何时使用单例对象以及何时在 scala 中使用实际对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6951230/

相关文章:

scala - 如何解决 eclipse 2019 中的 Scala 错误?

scala - 选项GenTraversableOnce吗?

scala - 为什么 "$$"不能用作将 scala 字符串拆分为数组的分隔符?

functional-programming - 具有所有中间值的列表的总和

ios - 如何在 swift 5 xcode 10 中创建在多个 View 中使用的单例 View

java - 应用程序设置设计方法

list - 根据多个包含过滤列表

haskell - 显示两个不同的斐波那契函数是等价的

node.js - 从异步方法返回数据的服务

ios - Swift 中的 dispatch_once 单例