왜 우리가 필요로 할 자바-9 모듈 시스템의 정적이 필요?

gstackoverflow :

나는 퍼즐 자바-9 기능을 배우고 어떤 기사 / 비디오를 읽기 시작했다.

나는 (옵션 의존성의 개념을 이해할 수 없다 requires static)

인용 기사 :

모듈이 다른 모듈에서 유형에 대해 컴파일 할 필요가 있지만, 실행시에 의존하지 않는 경우, 그것은 정적 절을 필요로 사용할 수 있습니다. foo는 정적 줄을 필요로하는 경우, 모듈 시스템은 컴파일 및 실행시에 다른 동작 :

컴파일시에, 줄이 있어야 또는 오류가있을 것입니다. 컴파일하는 동안 바는 foo를 읽을 수 있습니다.
실행 시간에 줄이 존재하지 않을 수 있으며 그 오류 나 경고도 발생합니다. 가 존재하는 경우, foo를 읽을 수 있습니다.

그래서 나는 것들을 몇 가지를 알고 싶어 :

  1. 무엇 컴파일 시간 동안 다른 모듈에 모듈 신뢰성을 할 이유가 아닌 런타임? 어떤 예? 롬복 같은 악기?

  2. 자바 이전에 자바-9 옵션 의존성의 모든 아날로그?

추신

에서 인용 : 나는 한 번 더 설명을 발견 기사 :

때때로 우리는 다른 모듈, 도서관의 사용자가 사용하고자하지 않습니다하지만 참조하는 코드를 작성합니다.

예를 들어, 우리는 또 다른 로깅 모듈이있을 때 우리의 내부 상태를 꽤 - 인쇄하는 유틸리티 함수를 작성할 수 있습니다. 그러나, 우리의 도서관이 아닌 모든 소비자는이 기능을 원할 것입니다, 그들은 여분의 로깅 라이브러리를 포함하지 않습니다.

이 경우, 우리는 선택적인 종속성을 사용하고 싶습니다. (가) 정적 지침을 필요로 사용하여, 우리는 컴파일 시간 전용 종속성을 만들 :

module my.module {
    requires static module.name;
}

그러나 그것은 나를 위해 절대적으로 명확하지 않다. 누구나 간단한 방법으로 그것을 설명 할 수 있을까요?

양배추 :
  1. 그것은 단지 컴파일 시간을 가지고 의미가 거기 라이브러리의 품위가 있습니다. 대부분 단지 개발 과정에서 도움에 존재하는 주석이 거래 (예를 들면 보일러를 줄이고, 버그를 방지). 몇 가지 예는 다음과 같습니다 :


    이 주석이하는 경향이 RetentionPolicy의를 SOURCE하거나 CLASS그들이 런타임시 유용 (또는 사용 가능)하지 않은 것을 의미한다. 배포 왜 응용 프로그램의 나머지 부분과 이러한 종속성을 제공? 없이 requires static당신이 할 것 강제 배포하는 경우를 포함, 그렇지 않으면 응용 프로그램이 누락으로 인해 종속성으로 시작되지 않을 것입니다.

  2. 당신은뿐만 아니라 옵션으로 사전 자바 9 이러한 종속성을 선언 할 것입니다. 어떤 의미의 많은 자바 프로젝트는 메이븐 또는 Gradle을 같은 빌드 도구를 사용합니다. 자동으로 구축하고 프로젝트, 그들이하는 일의 많은 부분을 테스트하는 도구 외에도입니다 의존성 관리 . 나는 메이븐 익숙 충분히 아니지만, Gradle을 사용시 하나를 사용합니다 :

    dependencies {
        compileOnly 'group.id:artifact-id:version'
    }
    

    런타임에 필요하지 않은 종속성을 선언합니다.

추천

출처http://43.154.161.224:23101/article/api/json?id=173496&siteId=1