斯卡拉特质中的Setter和Getters?

问题描述:

在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 
} 

我会做同样的在斯卡拉,还是以不同的方式完成?

吸气剂和吸附剂在斯卡拉并不常见。实际上,一个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

在斯卡拉,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