我试图使将对象的状态传递到“外部”成为可能,以便稍后可以通过将其传递回来对其进行恢复,但又不将私有状态公开给外部世界。在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/

10-09 09:02