2012-10-10 42 views

回答

4

在斯卡拉,object用于定义静态方法。你所描述听起来像你想的:

class MyClass(n: Int) 

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

所以,你可以做以下任一:

scala> val a = MyClass.apply(3) 
a: MyClass = [email protected] 

scala> val b = MyClass(3)  // works allowed because method is called "apply" 
b: MyClass = [email protected] 

我会称之为“工厂法”。

1

你可以把一个方法到配对对象,将其从斯卡拉调用静态的方式(即没有一个对象实例):

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

注意,Scala编译器实际上是创建一个名为A$一种新的合成类对于单身人士object A,因此行A.staticMethod在运行时存在的A$的单个实例上调用该方法。

值得注意的是:Scala编译器还会在A对字节码级的静态方法staticMethod转发调用A$.staticMethod - 在你在你的项目中混合Java和Scala代码的情况下,这意味着你也能然而

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

,如果你声明与同伴类A同名的方法,而一切都在Scala中以同样的方式仍然有效,静态转发方法:从Java调用这个静态方法是这样A将会生成而不是,您将不能o从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 
相关问题