【问题标题】:when to use singleton objects and when to use actual objects in scala何时使用单例对象以及何时在 scala 中使用实际对象
【发布时间】:2011-08-05 03:56:34
【问题描述】:

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

对此有任何指示吗?

【问题讨论】:

    标签: scala functional-programming singleton


    【解决方案1】:

    一般情况下,您会在以下情况下创建object

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        GetDataInput.getNameInput()
        

        在内部,scala 会懒惰地创建你的类的单个实例,并在程序运行期间保持它的活动状态,所以每当你调用对象上的方法时,你实际上是在调用托管类的单个实例的方法由 scala 运行时。

        【讨论】:

          猜你喜欢
          • 2014-08-05
          • 1970-01-01
          • 1970-01-01
          • 2013-11-22
          • 1970-01-01
          • 1970-01-01
          • 2011-05-17
          • 2011-09-06
          • 1970-01-01
          相关资源
          最近更新 更多