何时在scala中使用单例对象以及何时使用实际对象
我想知道在使用scala中的实际对象和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
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 {
...
}