2014-09-28 147 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