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

何时在scala中使用单例对象以及何时使用实际对象,scala,functional-programming,singleton,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("Ent

我想知道在使用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()
或者为这个类创建一个singleton对象并使用它访问方法是好的吗

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

有什么建议吗

问题是:“你需要一个类型的不同实例吗?”如果需要,那么选择一个类(或特征),如果不选择单例。顺便说一句,对于您正在使用的语言没有具体的指导方针,只是因为它内置了单例模式。

在scala中,对象的一个主要用途是充当单例的角色。如果要将类用作单例,只需将类本身声明为对象即可。然后你可以做:

GetDataInput.getNameInput()

在内部,scala将惰性地创建类的单个实例,并使其在程序期间保持活动状态,因此,无论何时调用对象上的方法,实际上都是调用由scala运行时管理的类的单个实例的方法。

通常在以下情况下创建一个
对象

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

  • 您需要编写java
    static
    方法或
    static final
    常量的等价物。(参见伴生物体)

  • 您需要一个更简单的枚举值替代方案(由
    对象
    实例扩展的
    密封特征

在您的示例中,所有函数都是纯函数,而类是无状态的。因此,所有实例将严格平等。将其转化为对象是有意义的:

object GetDataInput {
  def getNameInput() {
    println("Enter the name value: ")
  }
  ...
}
如果您做出了错误的选择,不要担心,重构很容易。通常,只需提取trait中的方法,即可保留对对象的所有现有调用:

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