在Java中,我有时会定义一个接口来确保类具有“setter”和“getter”。
例如,如果我在树中有一个节点,我可能会定义接口,例如:
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
}
我会在Scala中做同样的事情,还是以不同的方式完成?
答案 0 :(得分:8)
Getler和setter在Scala中并不常见。实际上,var是通过两个类似getter / setter的方法在内部实现的。如果你想要可变解决方案(如果可能的话,通常在Scala中避免使用),你可以简单地编写
trait Node {
var left:Node
var right:Node
var value:Int
}
class Node2D(var left:Node, var right:Node, var value:Int) extends Node
Node接口在这里提供了很少的附加值,我不喜欢它中的vars的想法,所以我可能完全摆脱接口,或者最终得到一个只读接口和一个可变的类:
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更容易返回更具体的类型(例如Node2D
中的Node
),所以不要担心需要{{1}的情况在Java中。
答案 1 :(得分:6)
在Scala中,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
值得注意的是,Scala中的首选设计是使用不可变对象并坚持功能编程范例。另请参阅http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-2。