2013-08-28 3 views
6

Scala 컴파일러는 -Xcheck-null에 런타임시 null 포인터 역 참조가 있는지 확인하려고 시도합니다.항상 null이 아닌 메소드 호출을 호출하십시오. 결과 :

그것은 나에게 괜찮습니다,하지만 난 로거 정의 가정, 즉 너무 많은 잘못된 반응을 얻을 : getLogger 결코 null 반환

private final val LOGGER: Logger = LoggerFactory.getLogger(classOf[GenericRestImpl]) 

방법을. 이 지식을 컴파일러에 전달하면 어떻게 불평하지 않을 수 있습니까? 나는 새 인스턴스를 만들 때

[WARNING] TestImpl.scala:31: warning: potential null pointer dereference: LOGGER.debug 
[WARNING]  LOGGER.debug("Using {} for sort", sortParam) 

나는 NotNull 특성으로 표시 할 수 있습니다 :

return new Foo() with NotNull. 
괜찮

하지만, 무엇을 객체가 다른 방법에서 돌아와 함께 할? 특히 제 3 자 라이브러리에서 오는 경우? 너무 많은 오버 헤드를 추가하기 때문에 모든 변수를 선택 사항로 표시하는 것이 싫습니다. 또한 암시 적 변환을 만들 생각이 없습니다. 왜냐하면 NotNull로 표시하려는 각 클래스에 대한 추가 클래스가 필요하기 때문입니다.

나는 Library support for Scala's NotNull trait 질문을 확인했지만 문제를 해결하는 데는 도움이되지 않았습니다. 당신은 아무것도에 태그를 NotNull을 사용할 수 있도록

+0

당신은 NotNull 형질이 마커 일뿐입니다. 더 이상 아무것도하지 않습니다. – Jatin

답변

5

Jatin 언급으로, NotNull, 그냥 마커 또는 태그입니다.이 작업을 수행하는 트릭 캐스트 사용자의 기본 유형 with NotNull.

그래서 만약 당신이 뭔가를 쓸 수 있습니다 강요하는 것입니다 이 "notnull".asInstanceOf[String with NotNull]. 절대 null이 아닐 것이라고 확신하는 경우 안전한 캐스트입니다.

실제 예에서3210

, 당신은 그러므로 작성할 수 있습니다

private final val LOGGER: Logger with NotNull = 
    LoggerFactory.getLogger(classOf[GenericRestImpl]).asInstanceOf[Logger with NotNull] 

을이 새로운 유형을 만들 필요는 없지만, 당신은 그것을 많이해야 할 경우는 조금 복잡, 당신은 일부를 사용할 수 있도록 작은 유틸이 표기법을 명확히/단순화하기 :

type NeverNull[T] = T with NotNull 
def neverNull[A](a: A): NeverNull[A] = a.asInstanceOf[A with NotNull] 

NeverNullNotNullneverNull 태그 모든 종류의 T 단지 별칭 것은 결코 널 (null) 인 것으로 유형 A의 기존 값에 태그를 조금 래퍼입니다.

implicit def neverNull[A](a: A): NeverNull[A] = a.asInstanceOf[A with NotNull] 

private final val LOGGER: NeverNull[Logger] = LoggerFactory.getLogger(classOf[GenericRestImpl]) 

NeverNull[Logger] 즉, 여전히 : 당신이 무슨 일을 정말 확신하는 경우

private final val LOGGER: NeverNull[Logger] = neverNull { 
     LoggerFactory.getLogger(classOf[GenericRestImpl]) 
} 

심지어이 암시 적 변환을 만들 수 :

그 다음으로 사용할 수 있습니다 Logger이므로 해당 클래스의 모든 메소드를 호출하거나 매개 변수로 Logger을 사용하는 함수로 전달할 수 있습니다.

구조의이 종류는 언 박싱 태그 유형라는 꽤 유용하며, 다른 응용 프로그램과 토론 herehere를 참조한다.

관련 문제