복붙노트

[SCALA] 스칼라의 경우 클래스 개인 생성자하지만 대중은 방법을 적용

SCALA

스칼라의 경우 클래스 개인 생성자하지만 대중은 방법을 적용

내가 개인 생성자 다음과 같은 경우 클래스가 나는 액세스 할 수없는 경우는 적용-방법을 동반자 객체.

case class Meter private (m: Int)

val m = Meter(10) // constructor Meter in class Meter cannot be accessed...

개인 생성자가있는 경우 클래스를 사용하지만, 동반자 공공 장소에서 생성 된 적용-방법을 유지하는 방법이 있나요?

나는 두 가지 옵션 사이 (내 예제에서) 차이가 없다는 것을 알고있다 :

val m1 = new Meter(10)
val m2 = Meter(10)

그러나 나는 첫 번째 옵션을 금지하고자합니다.

-- 편집하다 --

놀랍게도 다음 작품 (하지만 내가 원하는 무엇을 정말하지 않습니다)

val x = Meter
val m3 = x(10) // m3  : Meter = Meter(10)

해결법

  1. ==============================

    1.여기에 개인 생성자와 대중이 방법을 적용해야 할 기술이다.

    여기에 개인 생성자와 대중이 방법을 적용해야 할 기술이다.

    trait Meter {
      def m: Int
    }
    
    object Meter {   
      def apply(m: Int): Meter = { MeterImpl(m) }
      private case class MeterImpl(m: Int) extends Meter { println(m) }
    }
    
    object Application extends App {
      val m1 = new Meter(10) // Forbidden
      val m2 = Meter(10)
    }
    

    배경 정보 민간 및 보호 - 생성자 -에 - 스칼라

  2. ==============================

    2.이 요청 된 행동 (개인 생성자하지만 공공 .apply)는 스칼라 2.12 구현이 방법이있을 수 있습니다 보인다.

    이 요청 된 행동 (개인 생성자하지만 공공 .apply)는 스칼라 2.12 구현이 방법이있을 수 있습니다 보인다.

    나는 반대 각도에서이 온 - 개인의 경우 클래스 생성자는 또한 .apply 방법을 차단하고 싶습니다. 여기에 이유 : https://github.com/akauppi/case-class-gym

    사용 사례는 어떻게 다른지, 흥미 롭군요.

  3. ==============================

    3.그것은 몇 가지 암시 적 트릭 가능합니다 :

    그것은 몇 가지 암시 적 트릭 가능합니다 :

    // first case 
    case class Meter[T] private (m: T)(implicit ev: T =:= Int)
    object Meter { 
      def apply(m: Int) = new Meter(m + 5) 
    }
    

    일부 다른 생성자를 생성 (및 메소드 서명 적용) 그러나 매개 변수는 지능이 될 수 있음을 보증한다.

    당신이 (패턴 매칭, 해시 코드 및 equals와)의 경우 급 기능으로 케이스 클래스가 후 기본 생성자를 제외 :

    scala> val m = Meter(10)
    m: Metter[Int] = Meter(15)
    
    scala> val m = new Meter(10)
    <console>:9: error: constructor Meter in class Meter cannot be accessed in object $iw
           val m = new Meter(10)
    

    OR 형 태그 (순진 구현)와 :

    trait Private
    case class Meter private (m: Integer with Private)
    object Meter {
      def apply(m: Int) = new Meter((m + 5).asInstanceOf[Integer with Private])
    }
    

    그것은 예상대로 작동합니다 :

    val x = new Meter(10)
    <console>:11: error: constructor Meter in class Meter cannot be accessed in object $iw
                  new Meter(10)
                  ^
    
    val x = Meter(10)
    x: Meter = Meter(15)
    

    여기에 설명 된 기본 유형과 유형의 태그를 일으킬 수있는 문제

  4. from https://stackoverflow.com/questions/20030826/scala-case-class-private-constructor-but-public-apply-method by cc-by-sa and MIT license