2014-12-05 2 views
1

내 개인적인 불변 클래스 생성자 및 보조 생성자가 범위 내 클래스의 다른 요소없이 첫 번째 문으로 서로를 호출해야하는 제약 조건과 싸우는 동안 필자는 내 인스턴스 생성을위한 보조 개체를 사용하도록 제한되어있는 것처럼 보입니다. 내 동반자 개체는 주 생성자에 액세스해야하므로 해당 개체를 포함하는 범위를 대상으로하려면 private 키워드가 필요합니다. 이제 스칼라에서 클래스를 해당 객체 안에 선언 할 수 있습니까?

, 내 뇌가 이름 생성에 약한, 나는 객체 자체 동반자 내에서 내 수업을 배치하여 그 동반자 객체와 클래스 모두 바깥 쪽 네임 스페이스의 필요성을 저장하려고,이 방법 :

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) 
//... 

Groupprivate[Group] 인 것은 개체를 참조하지 않지만 클래스는 여전히 불필요합니다.

컴패니언 개체 수준에서 사용할 수 있도록 해당 생성자를 태그 할 수 있지만 외부에서는 사용할 수 없도록하려면 어떻게해야합니까?

PS : ...

편집을 그 동반자 개체가 이미 나에게 두통을주고있다, 나는 심지어 KO-범위 지정 여러 생성자의 구현이 필요로 할 수있는 complexCompute를,이 그냥 수업을하는 것이 바람직 것 : 좋아 . 태그를 추가하는 동안 나는 동반자 객체가 클래스의 범위에 대한 특권을 가질 수 있다고 저를 울리는 뉴런을 쳤습니다. 자체 파트에 액세스 할 수 있으므로 전용 인 클로징 범위가 없으면 단순히 객체와 클래스를 나란히 가질 수 있습니다. 그러나 나는 그러한 복싱 케이스에 대한 범위 지정을 처리 할 수있는 가능성있는 방법에 대한 응답과 동반자 개체가없는 클래스의 생성자 만 사용하는 기술에 대한 설명을 제공합니다.

+0

원래 "Scala에서 외부 범위를 참조 할 수 있습니까?"라는 질문을 변경했습니다. 나는 내가 시도 할 또 다른 이유를 찾았다면 그것을 따로 따로 구할 것이라고 생각한다. (내 이름은 레벨이 같은 이름을 가지고있을 때 개인 레벨을 정확하게 지정할 방법이 없다는 것이다.) – Nirvana

답변

3

그룹 개체는 동일한 네임 스페이스에 있지 않기 때문에 그룹 개체의 동반 개체가 아닙니다.

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

0

컴패니언 객체의 개인 또한 클래스에서 액세스 할 수있는, 그래서 난 내 근본 문제와 직결이 다른 옵션이 있습니다 : 동반자 객체 내 생성자에서 사용할 수있는 전체 privatable 범위를 만드는

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) 

그 나를 더 호흡하게한다. 내 모든 경우에 나는 실제로 개인적으로도 원하는 유형을 필요로 할 것입니다. 이 지역에서 유용한 범위를 포함하는 동반자를 만들어야한다는 사실은 지금 그렇게 중요하지 않을 수도 있습니다. 그러나 튜플을 사용하면 Dimitri의 옵션보다 더 복잡해집니다.

관련 문제