我试图使将对象的状态传递到“外部”成为可能,以便稍后可以通过将其传递回来对其进行恢复,但又不将私有状态公开给外部世界。在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;
}
}
但是,如果我在Scala中尝试相同的操作,则表明Walker#setState可能无法访问State#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中,每个外部类实例都有其自己的内部类类型,这意味着external1.inner.getClass!= outside2.inner.getClass。
从您的问题尚不清楚,是否需要为所有Walker提供相同的State类(例如,将walker1状态分配给walker2)。
我假设您确实希望它具有相同的类类型。您需要做的就是将Walker伴随对象中的State定义为private [Walker]:
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 = demos$Walker@4fccd51b
val w2 = new Walker //> w2 : demos.Walker = demos$Walker@475530b9
w1.state = w2.state
它的作用是将国家的pos定义为除Walker之外的所有人的私有位置。进一步了解here。
如果不需要Walker实例之间的State相同,则可以将State定义移到类本身中,范围为外部类:
private[Walker] class State (private[Walker] val pos: Int)
关于java - 访问内部类的私有(private)字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26086824/