访问内部类的私有字段

时间:2014-09-28 16:07:02

标签: java scala

我试图将对象的状态传递给“外部”,因此稍后可以通过将其传回来恢复,但不会将私有状态透露给外部世界。在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相同的内容? (克隆对象的其他人)

2 个答案:

答案 0 :(得分:2)

在类Sate内轻松声明课程Walker

class Walker {
    class State(pos: Int) {
        // other functionnalities
    }
    // use State
}

答案 1 :(得分:2)

在Scala中,每个外部类都有它自己的内部类类型,这意味着outer1.inner.getClass!= outer2.inner.getClass。
如果您需要为所有Walkers提供相同的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

它的作用是将State的pos定义为除Walker之外的所有人。详细了解here

如果你不需要状态在Walker实例之间相同,那么你可以将State定义移动到类本身,并将其限定为外部类:private[Walker] class State (private[Walker] val pos: Int)