2016-08-23 4 views
1

보통val (lazy이 아님) - 정확히 평가되는 시점은 언제입니까?평가는 정확히 평가되는 시점은 언제입니까?

클래스 및 싱글 톤 개체의 경우 클래스/개체가 인스턴스화 될 때라고 생각합니다. 그리고 특성을 구현하는 클래스가 인스턴스화 될 때. 패키지 객체의 경우 잘 모르겠습니다. 또한

class Test { 
    val someList = (1 to 1000) // evaluated when it's Test is instantiated 
} 

object Test { 
    val someList = (1 to 1000) // evaluated when Test gets instantiated 
} 

trait Test { 
    val someList = (1 to 1000) // evaluated when a class implementing Test is instantiated 
} 

package object Test { 
    val someList = (1 to 1000) // ??? 
} 

는 먼저 접근 때와 deflazy val이 모두 계산되어 주어진 val 한번만 평가 그들 사이의 유일한 주요 차이는? 성능 관점에서

class Test { 
    lazy val someList = (1 to 1000) // evaluated at access time, once 
    def someList = (1 to 1000) // evaluated at access time for each access 
} 

, 내 현재의 가정은 빨리 될 것입니다 이미 평가 valdef 또는 (같은 일의) val하지만, 이후의 액세스의 첫 번째 액세스 사이에 차이가 (기본적으로이 없다는 것입니다 평가되는 것이 무엇이든간에 상당한 것으로 가정).

따라서 한 번만 평가해야하는 큰 목록이있는 경우 val을 사용해야합니다. (사용하지 않을 것이라는 확신이 없으면 첫 번째 액세스의 성능은 저에게 문제가되지 않습니다. a lazy 하나)?

답변

3

네, 모두 정확합니다. 패키지 객체는 초기화와 관련하여 정상적인 객체처럼 동작합니다.

+0

확인을위한 환호. – Nio

관련 문제