2011-02-12 123 views
3

在Java中,我有時會定義一個接口來確保類有「setters」和「getters」。斯卡拉特質中的Setter和Getters?

舉例來說,如果我有一個樹中的節點我可能定義的接口,如:

public interface Node { 

    Node getLeft(); 

    void setLeft(Node node); 

    Node getRight(); 

    void setRight(Node node); 

    int getValue(); 
} 

,然後我的節點將實現這個接口:

public Node2D implements Node{ 
    //implements all of Node's methods along with getters 
    // and setters 
} 

我會做同樣的在斯卡拉,還是以不同的方式完成?

回答

7

吸氣劑和吸附劑在斯卡拉並不常見。實際上,一個var是通過兩個類似getter/setter的方法在內部實現的。如果你想在可變的解決方案(這通常是在斯卡拉如果可能避免的),你可以簡單地寫

trait Node { 
    var left:Node 
    var right:Node 
    var value:Int 
} 

class Node2D(var left:Node, var right:Node, var value:Int) extends Node 

節點接口這裏提供了一些額外的價值,我不喜歡它瓦爾的想法,所以我可能會擺脫接口的產品總數,或將結束與一個只讀接口和一個可變類:

trait Node { 
    def left:Node 
    def right:Node 
    def value:Int 
} 

class Node2D(var left:Node, var right:Node, var value:Int) extends Node 

注意,模式匹配使得它在Scala中更容易得到一個更具體類型(如從Node起的Node2D),所以不要擔心在Java中需要instanceof的情況。

+0

謝謝,我用過你的第二個例子,迄今爲止工作! – drozzy 2011-02-13 00:51:07

5

在斯卡拉,getter和setter在語法上與var相同。所以,你可以聲明變量爲var在您的特質:

trait A { 
    var x: Int 
} 

然後,你可以實現它只是作爲一個var,或用getter和setter方法,如果你想:

class B extends A { 
    var _x: Int = 0 

    def x: Int = _x 

    def x_=(value: Int) { 
    println("Setting x to "+value) 
    _x = value 
    } 
} 

class C extends A { 
    var x = 1 
} 

最後,這裏是如何它看起來像使用getter和setter方法:

val b = new B 
b.x // is 0 
b.x = 10 
b.x // is 10 

val c = new C 
c.x // is 1 
c.x = 20 
c.x // is 20 

值得一提的是,在斯卡拉的首選設計是使用一成不變的對象堅持功能性編程範例。另見http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-2