[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.여기에 개인 생성자와 대중이 방법을 적용해야 할 기술이다.
여기에 개인 생성자와 대중이 방법을 적용해야 할 기술이다.
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.이 요청 된 행동 (개인 생성자하지만 공공 .apply)는 스칼라 2.12 구현이 방법이있을 수 있습니다 보인다.
이 요청 된 행동 (개인 생성자하지만 공공 .apply)는 스칼라 2.12 구현이 방법이있을 수 있습니다 보인다.
나는 반대 각도에서이 온 - 개인의 경우 클래스 생성자는 또한 .apply 방법을 차단하고 싶습니다. 여기에 이유 : https://github.com/akauppi/case-class-gym
사용 사례는 어떻게 다른지, 흥미 롭군요.
-
==============================
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)
여기에 설명 된 기본 유형과 유형의 태그를 일으킬 수있는 문제
from https://stackoverflow.com/questions/20030826/scala-case-class-private-constructor-but-public-apply-method by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 파티션에 행을 변환하는 방법 (0) | 2020.03.02 |
---|---|
[SCALA] 어떻게 스칼라에서 서로 다른 두 개의 dataframe 인쇄 열을 비교 (0) | 2020.02.21 |
[SCALA] 왜 NullPointerException이에서 UDF 결과에서 DataFrame를 accesing? (0) | 2020.02.08 |
[SCALA] 선물 / 성공 경주 (0) | 2020.01.24 |
[SCALA] 익명 함수를 정의하기 위해 밑줄을 결정할 수있는 규칙은 무엇입니까? (0) | 2020.01.15 |