복붙노트

[SCALA] 케이스 클래스를 선언 할 때 나는 마지막 수정을 사용해야합니까?

SCALA

케이스 클래스를 선언 할 때 나는 마지막 수정을 사용해야합니까?

스칼라 - wartremover 정적 분석 도구에 따르면 내가 만드는 모든 경우 클래스의 앞에 "최종"추가해야한다 오류 메시지가 "케이스 클래스가 최종해야한다"말했다.

희생양 (스칼라의 또 다른 정적 분석 도구)에 있지 않고 내가해야 따르면 (오류 메시지 : "케이스 클래스의 중복 최종 수정")

누가 맞다, 그 이유는 무엇입니까?

해결법

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

    1.그것은 그것을 사용하는 것은 변경 일을한다는 의미에서 중복되지 않습니다. 사람이 기대하는 것처럼, 당신은 최종 경우 클래스를 확장 할 수 없습니다,하지만 당신은 아닌 마지막 하나를 확장 할 수 있습니다. 왜 wartremover 최종해야하는 경우 클래스를 제안 하는가? 글쎄, 그들을 연장 정말 아주 좋은 생각이 아니다 때문이다. 이걸 고려하세요:

    그것은 그것을 사용하는 것은 변경 일을한다는 의미에서 중복되지 않습니다. 사람이 기대하는 것처럼, 당신은 최종 경우 클래스를 확장 할 수 없습니다,하지만 당신은 아닌 마지막 하나를 확장 할 수 있습니다. 왜 wartremover 최종해야하는 경우 클래스를 제안 하는가? 글쎄, 그들을 연장 정말 아주 좋은 생각이 아니다 때문이다. 이걸 고려하세요:

    scala> case class Foo(v:Int)
    defined class Foo
    
    scala> class Bar(v: Int, val x: Int) extends Foo(v)
    defined class Bar
    
    scala> new Bar(1, 1) == new Bar(1, 1)
    res25: Boolean = true
    
    scala> new Bar(1, 1) == new Bar(1, 2)
    res26: Boolean = true
    // ????
    

    정말? 바 (1,1) (1,2) 바 같습니다? 예기치 않은 것입니다. 그러나 대기가 더있다 :

    scala> new Bar(1,1) == Foo(1)
    res27: Boolean = true
    
    scala> class Baz(v: Int) extends Foo(v)
    defined class Baz
    
    scala> new Baz(1) == new Bar(1,1)
    res29: Boolean = true //???
    
    scala> println (new Bar(1,1))
    Foo(1) // ???
    
    scala> new Bar(1,2).copy()
    res49: Foo = Foo(1) // ???
    

    바의 사본은 형 푸있다? 이 잘 될 수 있을까?

    확실히, 우리는 .equals를 재정 의하여이 문제를 해결 (및 .hashCode과로 .toString 및 .unapply 및 .copy, 또한, 아마도, .productIterator, .productArity, .productElement 등) 할 수 있습니다 바 바즈에 방법. 그러나,이 경우 클래스가 깨진 것 확장하는 모든 클래스 "상자 밖으로".

    이 이유는, 당신은 더 이상 다른 경우 클래스 경우 클래스를 확장 할 수 없다, 내가 스칼라 2.11를 생각 때문에 금지하고있다. 비의 경우 클래스 경우 클래스를 확장 여전히 wartremover의 의견으로는, 적어도 허용되지만 정말 좋은 생각이 아니다.

  2. from https://stackoverflow.com/questions/34561614/should-i-use-the-final-modifier-when-declaring-case-classes by cc-by-sa and MIT license