2014-09-28 118 views
0

我试图使对象的状态传递到“外部”,因此稍后可以通过将它传回来恢复,但不会向外部世界公开私有状态。在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中相同的东西? (其它的是克隆的对象)

回答

2

在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)

+0

谢谢!我以前不知道那个私有[Something]语法。我甚至没有考虑过这个问题,如果“Walker”可以交换“State”。 – edave 2014-09-28 22:08:08

2

Smiply声明类Walker内的类Sate

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

很抱歉,但我仍然看不到任何方式访问沃克内的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

+0

这是行不通的,因为沃克确实除非你定义范围 – roterl 2014-09-28 21:23:39

+0

我没有真正理解为什么......我的意思是这些访问修饰符的基本点是隐藏实现细节,不是吗?为什么类会从自己的内部类中隐藏实现细节? – edave 2014-09-28 22:12:30