访问内部类的私有字段
我试图使对象的状态传递到“外部”,因此稍后可以通过将它传回来恢复,但不会向外部世界公开私有状态。在Java中,我可以用一个内部类做到这一点:访问内部类的私有字段
class Walker {
class State {
private int pos;
private State (int p) {
pos = p;
}
}
private int pos = 0;
State setState() {
return new State(pos);
}
void setState (State s) {
pos = s.pos;
}
}
不过,如果我尝试在斯卡拉一样的,它说,沃克#的setState可能无法访问状态#POS。
class Walker {
private var pos = 0
def state = new Walker.State(pos)
def state_= (s: Walker.State) {
pos = s.pos
}
}
object Walker {
class State (private val pos: Int)
}
如何存档与Java中相同的东西? (其它的是克隆的对象)
在Scala中每个外类instace都有它自己的内部类型,这意味着outer1.inner.getClass = outer2.inner.getClass。
从您的问题中不清楚,如果您需要如果您需要为所有步行者拥有相同的州级(例如将walker1状态分配给walker2),或者不需要。 我假设你确实希望它具有相同的类类型。所有你需要这样是在沃克同伴对象界定国家作为私人[步行者]:
class Walker {
private var pos = 0
def state = new Walker.State(pos)
def state_= (s: Walker.State) {
pos = s.pos
}
}
object Walker {
class State (private[Walker] val pos: Int)
}
val w1 = new Walker //> w1 : demos.Walker = [email protected]
val w2 = new Walker //> w2 : demos.Walker = [email protected]
w1.state = w2.state
它的作用是为私有定义国家的POS所有,但沃克。查看更多关于它here。
如果您不需要国家是沃克实例之间一样,那么您可以在状态定义移动到类本身与范围的外部类:private[Walker] class State (private[Walker] val pos: Int)
Smiply声明类Walker
内的类Sate
:
class Walker {
class State(pos: Int) {
// other functionnalities
}
// use State
}
很抱歉,但我仍然看不到任何方式访问沃克内的pos。另外,不会在其他类中声明该类,导致Scala为每个Walker实例创建一个新的State类? (根据[这](https://weblogs.java.net/blog/cayhorstmann/archive/2011/08/05/inner-classes-scala-and-java)) – edave 2014-09-28 16:29:01
这是行不通的,因为沃克确实除非你定义范围 – roterl 2014-09-28 21:23:39
我没有真正理解为什么......我的意思是这些访问修饰符的基本点是隐藏实现细节,不是吗?为什么类会从自己的内部类中隐藏实现细节? – edave 2014-09-28 22:12:30
谢谢!我以前不知道那个私有[Something]语法。我甚至没有考虑过这个问题,如果“Walker”可以交换“State”。 – edave 2014-09-28 22:08:08