복붙노트

[SCALA] 스칼라에서; 나는 응용 프로그램의 특성을 사용해야합니까?

SCALA

스칼라에서; 나는 응용 프로그램의 특성을 사용해야합니까?

난 그냥 스칼라를 배우기 시작하고 나는 주요 방법에 대해 서로 다른 표현의 조합을 사용하여 다음있어하는 튜토리얼의 많은했습니다. 이외에도 친숙한 주요 방법에서; 특성 응용 프로그램 또는 응용 프로그램의 사용도 있습니다. 이 응용 프로그램은 더 이상 사용되지 않으며 권장하지 않은 것 같습니다,하지만 난 많은 진입 점을 정의하기 위해 이러한 방법 각각에 대한이 이상의 설명 정보를 찾을 수 없습니다.

누군가가 나에게 설명 할 수 있다면 그래서 궁금하네요 :

해결법

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

    1.실제로 그 문서에 설명되어있는 특성 응용 프로그램의 문제 :

    실제로 그 문서에 설명되어있는 특성 응용 프로그램의 문제 :

    이것은 까다로운 하나입니다. 당신이 응용 프로그램의 특성을 확장 할 경우, 당신은 기본적으로 자바 클래스를 만드는 :

    class MyApplication implements Application {
      static {
        // All code goes in here
      }
    }
    

    JVM은 초기화 암시하여 MyApplication 클래스에 동기화 위의 클래스를 실행합니다. 이 방법은, 그것의 클래스가 초기화되기 전에에서는 MyApplication의 어떤 인스턴스가 생성되지 않도록 보장된다. 다시하여 MyApplication의 인스턴스에 액세스해야하는 응용 프로그램에서 스레드를 생성 할 경우 전체 프로그램이 실행 된 후, 응용 프로그램이 것 클래스 초기화 죽은 잠금은 완료됩니다. 이 인스턴스가 한 프로그램이 실행되는 만들 수 없습니다와 같은 역설을 의미한다.

    클래스 이니셜은 인수를 가지고 있지 않습니다. 모든 값은 당신도 정적 필드의 값을 할당하기 전에 실행해야 초기화 클래스로 클래스에 넘겨되기 전에 또한, 먼저 실행됩니다. 따라서, 당신은 일반적으로 주요 방법에받을 수있는 인수는 손실됩니다.

    JVM은 자주 실행되는 코드를 최적화합니다. 이 방법은, 그것은 더 실행 시간이 정말 성능 병 목없는 방법에 낭비되고 있는지 확인합니다. 그러나, 안전하게 고정 방법은 그들 만이 수동으로 호출 할 수 없기 때문에 한 번 실행한다고 가정합니다. 따라서, 당신이 응용 프로그램의 특성을 사용하는 경우에는 응용 프로그램의 주요 방법 코드 인 클래스 초기화에서 실행되는 코드를 최적화하지 않습니다.

    앱 특성 수정이 모든 DelayedInit을 연장. 이 특성은 명시 적으로 초기화 코드는 클래스 초기화에서하지만 다른 방법에서 실행되지 않도록 스칼라 컴파일러로 알려져있다. 형질의 유일한 방법에 haded되는 이름 참조에 대한 참고 :

    trait Helper extends DelayedInit {
      def delayedInit(body: => Unit) = {
        println("dummy text, printed before initialization of C")
        body
      }
    }
    

    DelayedInit 다음 delayedInit 메소드로 전달 함수 이름에 해당하는 구현 클래스 또는 객체의 스칼라 컴파일러 랩 초기화 코드를 구현하는 경우. 어떤 초기화 코드를 직접 실행되지 않습니다. 이니셜 라이저가 프로그램의 엔트리 포인트와 출구 주위에 싸여 콘솔 응용 프로그램의 런타임 통계를 인쇄하려면, 예를 들어 스칼라 수 있습니다 무엇을 실행하기 전에이 방법은 또한 코드를 실행할 수 있습니다. 그러나이 방법의 몇 가지주의 사항이 있습니다 및 DelayedInit를 사용하는 것은 그러므로되지 않습니다. 당신은 정말에만 응용 프로그램 특성에 의해 부과 된 문제를 해결 앱 특성에 의존한다. 당신은 DelayedInit에 직접 구현하지 않아야합니다.

    당신이 원한다면 당신은 여전히 ​​당신이 객체에 정의 등의 주요 방법을 정의 할 수 있습니다. 이것은 대부분 스타일의 문제입니다 :

    object HelloWorld {
      def main(args: Array[String]) {
        println("Hello, world!")
      }
    }
    
  2. from https://stackoverflow.com/questions/24437423/in-scala-should-i-use-the-app-trait by cc-by-sa and MIT license