2014-12-05 46 views
1

雖然與我的私有不可變類構造函數以及輔助構造函數必須作爲第一條語句互相調用的約束作鬥爭,但沒有任何其他類來自作用域中的類,我似乎被約束爲我的實例化使用伴隨對象,並且因爲我的伴侶對象必須訪問主構造函數,所以我需要private關鍵字來定位包含該對象的作用域。我可以在Scala中聲明該類中的伴侶對象嗎?

現在,我的大腦是名代弱,我想通過把班裏的同伴中的對象本身保存一個封閉的命名空間都那個伴侶對象和類的需求,這種方式:

object Group { 
    private def complexComputeX(z: Int) = z 
    private def complexComputeY(x: Int, z: Int) = x + z 
    def apply(z: Int) = { 
    val x = complexComputeX(z) 
    val y = complexComputeY(x, z) 
    new Group(x, y) 
    } 
    class Group private[Group](x: Int, y: Int) { 
    //... 
    } 
} 
val x = Group(5) 
//... 

問題是的private[Group]沒有引用該對象,但仍然是該類(使其成爲多餘的)。

如何標記該構造函數在伴隨對象級別可用,但不在外部?

PS:那個伴侶對象已經讓我頭疼,我甚至寧願剛纔的類,EN-作用域那裏complexCompute,這幾個構造函數的實現可能需要...

編輯:好的。就在添加標籤時,我碰到一個神經元,我發現伴侶對象可能對類的範圍有一些特權。它可以訪問它的私有部分,所以我可以在沒有專門的封閉範圍的情況下簡單地擁有對象和類。然而,我保持這個問題,對於可能的方式來處理這樣的拳擊案例範圍的迴應object Main {object Main {object Main...以及關於僅具有沒有任何伴隨對象的類中的構造函數的技術的評論的機會。

+0

更改了原來的問題「我們如何引用Scala中的外部範圍?」。如果我找到另一個嘗試的理由(我敢打賭,當層級具有相同的名稱時,沒有辦法精確指定私有層面),我想我會單獨詢問它。 – Nirvana 2014-12-13 22:05:42

回答

3

您的Group對象不是您的Group類的伴侶對象,因爲它們不在同一個命名空間中。

您不必爲private修飾符提供範圍。如果您將其保留爲空,則只能通過此類及其伴侶對象訪問。

object Something { 

    class Group private(x: Int, y: Int) 
    object Group { 
    private def complexComputeX(z: Int) = z 
    private def complexComputeY(x: Int, z: Int) = x + z 
    def apply(z: Int) = { 
     val x = complexComputeX(z) 
     val y = complexComputeY(x, z) 
     new Group(x, y) 
    } 
    } 
    val x = Group(5) 

    // This line doesn't compile 
    new Group(42, 45) 
} 
+0

啊,對,謝謝。就像我發佈我的編輯一樣。我仍然有興趣知道是否可以處理具有相同名稱的嵌套關卡。 – Nirvana 2014-12-05 19:36:08

0

同伴對象的私人也可從類訪問,所以我有這樣的其他選項,關於我的根的問題:

object Group { 
    private def computeX(z: Int) = z 
    private def computeY(x: Int, z: Int) = x + z 
    private def computeXY(z: Int) = { 
    val x = computeX(z) 
    (x, computeY(x, z)) 
    } 
} 
class Group private (x: Int, y: Int) { 
    private def this(xy: (Int, Int)) = this(xy._1, xy._2) 
    def this(z: Int) = this(Group.computeXY(z)) 
} 
val group = new Group(5) 

那同伴對象進行提供一個完整的privatable範圍從我的構造函數讓我呼吸更好。在我的全部案例中,我確實也需要我想要的私人類型。我想,現在我被迫創建一個同伴來包含這個本地有用的範圍可能並不那麼重要。 但是,元組的使用使得它比Dimitri的選項更麻煩。

相關問題