什么相当于Scala中的python @classmethod或@staticmethod?

时间:2012-10-10 21:42:21

标签: python scala

当我不想使用implicits但希望有一个函数可以从(例如)Int转换为MyClass时,这非常有用。

2 个答案:

答案 0 :(得分:4)

在Scala中,object用于定义静态方法。您所描述的内容听起来像是您想要的:

class MyClass(n: Int)

object MyClass {
  def apply(n: Int) = new MyClass(n)
}

这样你就可以做到以下任何一种:

scala> val a = MyClass.apply(3)
a: MyClass = MyClass@70d1c9b5

scala> val b = MyClass(3)       // works allowed because method is called "apply"
b: MyClass = MyClass@1b4b2db7

我称之为“工厂方法”。

答案 1 :(得分:1)

您可以将一个方法放入随播对象中,以便从Scala以静态方式调用它(即没有对象实例):

// Scala
class A
object A {
  def staticMethod = println("Foo!")
}
A.staticMethod // prints "Foo!"

请注意,Scala编译器实际上为单例A$创建了一个名为object A的新合成类,因此行A.staticMethodA$的单个实例上调用该方法它存在于运行时。

值得注意的是:Scala编译器还在字节码级别的staticMethod中创建了一个静态方法A,它将调用转发给A$.staticMethod - 以防您混合使用Java和Scala代码你的项目,这意味着你也可以像这样从Java调用这个静态方法:

// Java
A.staticMethod(); // works

但是,如果在伴随类A中声明具有相同名称的方法,虽然Scala中的所有内容仍然以相同的方式工作,A中的静态转发器方法将生成,您将无法从Java调用staticMethod

// Scala
class A {
  def staticMethod = println("I'm doing something else.")
}
object A { // no companion class
  def staticMethod = println("Foo!")
}
A.staticMethod // prints "Foo!"

// Java
A.staticMethod(); // won't work