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

时间:2011-08-05 03:56:35

标签: scala functional-programming singleton

我想知道是否有任何特定规则,或者在scala中使用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 个答案:

答案 0 :(得分:4)

通常情况下,您会在object时出现:

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

  • 您希望编写等效的java static方法或static final常量。 (参见Companion对象)。

  • 您想要一个更简单的枚举值替代方法(由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 {
   ...
}

答案 1 :(得分:3)

问题是:“你需要不同类型的实例吗?”如果是这样,那么去一个班级(或一个特质),如果不是单身。顺便说一句,没有针对您使用的语言的具体指导原则,因为它内置了单例模式。

答案 2 :(得分:2)

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

GetDataInput.getNameInput()

在内部,scala将懒惰地创建一个类的实例并在程序的持续时间内保持活动状态,因此无论何时在对象上调用方法,您实际上都在调用托管类的单例实例的方法通过scala运行时。

相关问题