我想知道是否有任何特定规则,或者在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()
}
关于此的任何指示?
答案 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运行时。