[SCALA] 스칼라 열거 값을 재정의
SCALA스칼라 열거 값을 재정의
지금까지 내가 말할 수있는 스칼라 값 (INT), 값 (문자열)과 가치 (INT, 문자열)에 대한 열거 값 클래스에 대한 정의가 있습니다.
다른 생성자를 지원하는 새로운 가치의 서브 클래스를 생성하는 예에 사람의 노하우를합니까?
내가 값을 가진 열거 만들려면 예를 들어, (INT, 문자열, 문자열) 객체, 나는 그것을 어떻게 할 것인가? 나는 열거 클래스를 사용하는 다른 모든 혜택을드립니다.
감사.
해결법
-
==============================
1.열거 값은 발 클래스의 인스턴스가 있습니다. 이 클래스는 확장 할 수 있으며, 공장 방법을 추가 할 수 있습니다.
열거 값은 발 클래스의 인스턴스가 있습니다. 이 클래스는 확장 할 수 있으며, 공장 방법을 추가 할 수 있습니다.
object My extends Enumeration { val A = Value("name", "x") val B = Value("other", "y") class MyVal(name: String, val x : String) extends Val(nextId, name) protected final def Value(name: String, x : String): MyVal = new MyVal(name, x) } scala> My.B.id res0: Int = 1 scala> My.B.x res1: String = y
-
==============================
2.사실 스칼라의 열거는 자바에 비해 훨씬 단순한 의미를 갖습니다. 당신의 목적을 위해 당신이 어떤 방식으로 열거 나 그 가치를 서브 클래스 필요가 없습니다, 당신은 단지 발 같은 컴패니언 객체에서 자신의 유형을 인스턴스화 할 필요가있다. MyEnum = MyEnum.Value 당신이 토마스 정에 의해 제공되는 예에서 가능하지 않은 자바로했다 같이이 방법 당신은 발 값의 친숙한 액세스 모델을 얻을 수 있습니다. My.MyVal = MyEnum.Value는 솔루션의 모든 hackiness 외에 나에게 보인다 좀 혼란 : 당신은 DEF 가치가있을 것이다. 여기에 내가 제안 내용의 예는 다음과 같습니다
사실 스칼라의 열거는 자바에 비해 훨씬 단순한 의미를 갖습니다. 당신의 목적을 위해 당신이 어떤 방식으로 열거 나 그 가치를 서브 클래스 필요가 없습니다, 당신은 단지 발 같은 컴패니언 객체에서 자신의 유형을 인스턴스화 할 필요가있다. MyEnum = MyEnum.Value 당신이 토마스 정에 의해 제공되는 예에서 가능하지 않은 자바로했다 같이이 방법 당신은 발 값의 친숙한 액세스 모델을 얻을 수 있습니다. My.MyVal = MyEnum.Value는 솔루션의 모든 hackiness 외에 나에게 보인다 좀 혼란 : 당신은 DEF 가치가있을 것이다. 여기에 내가 제안 내용의 예는 다음과 같습니다
class MyEnum(myParam:String) object MyEnum { val Value1 = new MyEnum("any parameters you want") val Value2 = new MyEnum("") object Value3 extends MyEnum("A different approach to instantialization which also lets you extend the type in place") }
스칼라 모범 사례 : 열거 대 형질 상속 여기에서는 좀 더 복잡한 예제를 찾을 수 있습니다
-
==============================
3.여기에 또 다른 간단한 방법은 다음과 같습니다
여기에 또 다른 간단한 방법은 다음과 같습니다
scala> :paste // Entering paste mode (ctrl-D to finish) object Colors extends Enumeration { sealed case class Color private[Colors](hexCode: String, name: String) extends Val(name) val Black = Color("#000000", "black") val White = Color("#FFFFFF", "white") } // Exiting paste mode, now interpreting. defined object Colors scala> Colors.Black.hexCode res0: String = #000000 scala> Colors.Black.name res1: String = black scala> Colors.values res2: Colors.ValueSet = Colors.ValueSet(black, white) scala>
-
==============================
4.나는 Enumeration.Val 클래스를 확장하여 그 일을 선호하는 것이다.
나는 Enumeration.Val 클래스를 확장하여 그 일을 선호하는 것이다.
귀하의 요구 사항을 위해, 나는 샘플을 아래에 게시 할 것입니다 :
object FileType extends Enumeration { val csv = Val(1,"csv", ",") val tsv = Val(2,"tsv", "\t") protected case class Val(num: Int, fileType: String, delimiter: String) extends super.Val implicit def valueToFileType(x: Value): Val = x.asInstanceOf[Val] }
값에 액세스하는 것은 다음과 같다 :
scala> FileType.csv res0: FileType.Val = csv scala> FileType.csv.delimiter res29: String = ,
from https://stackoverflow.com/questions/2507273/overriding-scala-enumeration-value by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 동시성 가시성 발 대 스칼라 최종 (0) | 2019.11.20 |
---|---|
[SCALA] 방법 반복자와보기의 차이점은 무엇입니까? (0) | 2019.11.20 |
[SCALA] 목록의 하나에 Eithers의 목록을 설정하는 가장 좋은 방법은? (0) | 2019.11.20 |
[SCALA] 왜 케이스 클래스 동반자 개체는 기능을 확장 할 수 있습니까? (0) | 2019.11.20 |
[SCALA] 어떻게 패턴 일치 큰 스칼라 케이스 클래스? (0) | 2019.11.19 |