2012-10-10 55 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 
相關問題