@Nullable 및 @Nonnull 주석을 더 효과적으로 사용하는 방법은 무엇입니까?
알겠어.@Nullable
그리고.@Nonnull
주석은 예방에 도움이 될 수 있습니다.NullPointerException
단, 멀리까지 전파되지는 않습니다.
- 이러한 주석의 효과는 한 수준의 간접 작업 후 완전히 떨어지기 때문에 몇 개만 추가하면 크게 전파되지 않습니다.
- 이러한 주석들은 잘 시행되지 않기 때문에 다음과 같이 표시된 값을 가정할 위험이 있다.
@Nonnull
는 늘이 아니기 때문에 늘체크를 실행하지 않습니다.
다음 코드는 다음과 같이 표시된 매개 변수를 발생시킵니다.@Nonnull
되려고null
아무런 불만도 제기하지 않고요.을 던지다NullPointerException
실행할 때 사용합니다.
public class Clazz {
public static void main(String[] args){
Clazz clazz = new Clazz();
// this line raises a complaint with the IDE (IntelliJ 11)
clazz.directPathToA(null);
// this line does not
clazz.indirectPathToA(null);
}
public void indirectPathToA(Integer y){
directPathToA(y);
}
public void directPathToA(@Nonnull Integer x){
x.toString(); // do stuff to x
}
}
이러한 주석을 보다 엄격하게 적용하거나 더 많이 전파할 수 있는 방법이 있습니까?
간단한 답변: 이러한 주석은 IDE가 잠재적인 null 포인터 오류를 경고하는 데에만 유용합니다.
"Clean Code"에서 설명한 바와 같이 공개 메서드의 파라미터를 확인하고 불변성을 체크하지 않도록 해야 합니다.
또 다른 유용한 힌트는 null 값을 반환하지 않고 대신 Null Object Pattern을 사용하는 것입니다.
IDE가 합격 시 힌트를 제공하는 것 이외null
인수가 null이 아닌 것으로 예상되는 메서드에는 다음과 같은 이점이 있습니다.
- 정적 코드 분석 도구는 IDE와 동일한 테스트를 수행할 수 있습니다(FindBugs 등).
- AOP(Aspect-Oriented Programming)를 사용하여 이러한 주장을 확인할 수 있습니다.
이를 통해 코드 유지보수가 용이해집니다(필요없기 때문에).null
체크) 및 에러 발생률이 낮아집니다.
이 원래의 질문은 @NonNull을 사용하지만 런타임 null-pointer 체크가 여전히 필요하다는 일반적인 권장 사항을 간접적으로 지적하고 있다고 생각합니다.다음 링크를 참조하십시오.
위의 블로그에서는 다음 사항을 권장합니다.
옵션 유형 주석은 런타임 검증을 대체하지 않습니다. 유형 주석 이전에는 nullability 또는 범위 등을 설명하는 주요 위치가 javadoc에 있었습니다.타입 주석의 경우, 이 통신은 컴파일 타임 검증을 위해서 바이트 코드로 보내집니다.코드는 런타임 검증을 계속 수행합니다.
Eclipse의 원래 예제를 컴플라이언스 1.8로 컴파일하고 주석 기반 null 분석을 활성화하면 다음과 같은 경고가 표시됩니다.
directPathToA(y);
^
Null type safety (type annotations): The expression of type 'Integer' needs unchecked conversion to conform to '@NonNull Integer'
이 경고는 생성된 코드를 raw 유형("체크되지 않은 변환")을 사용하여 레거시 코드와 혼합할 때 발생하는 경고와 유사합니다.여기도 같은 상황이 있습니다.방법입니다.indirectPathToA()
에는 늘 계약을 지정하지 않는다는 점에서 "signates" 서명이 있습니다.툴은 이를 쉽게 보고할 수 있으므로 null 주석을 전파해야 하지만 아직 전파되지 않은 모든 골목을 추적합니다.
그리고 영리함을 사용할 때@NonNullByDefault
매번 이런 말을 할 필요도 없어요.
즉, null 주석이 "매우 멀리 전파"되는지 여부는 사용하는 도구와 도구에 의해 발행되는 모든 경고에 얼마나 엄격하게 대처하는지에 따라 달라집니다.TYPE_USE null 주석을 사용하면 Null이 유형 시스템의 인트릭 속성이 되었기 때문에 프로그램 내의 모든 가능한 NPE에 대해 툴이 경고하도록 할 수 있습니다.
프로젝트에서는 "상수 조건 및 예외" 코드 검사에서 다음 옵션을 활성화합니다.
null을 반환할 가능성이 있는 메서드에 대해 @Nullable 주석을 제안하고 null 값을 비주석 매개 변수로 전달합니다.
활성화 시 비주석 파라미터는 모두 Null 이외의 파라미터로 취급되므로 간접콜에서도 경고가 표시됩니다.
clazz.indirectPathToA(null);
더욱 강력한 체크를 위해서는 Checker Framework를 선택하는 것이 좋습니다(이 튜토리얼을 참조하십시오).
주의: 아직 사용하지 않았습니다.Jack 컴파일러에 문제가 있을 수 있습니다.이 버그 리포트를 참조해 주세요.
나는 주석이 "매우 멀리 전파되지 않는다"는 것에 동의한다.하지만, 나는 그 실수를 프로그래머 쪽에서요.
이해했습니다.Nonnull
주석을 문서로 사용합니다.다음 메서드는 (전제조건으로) non-null 인수를 필요로 하는 것을 나타냅니다.x
.
public void directPathToA(@Nonnull Integer x){
x.toString(); // do stuff to x
}
다음 코드 스니펫에는 버그가 포함되어 있습니다.메서드가 호출됩니다.directPathToA()
그것을 강요하지 않고y
는 비호환입니다(즉, 착신측 메서드의 전제 조건을 보증하는 것은 아닙니다).한 가지 방법은 다음과 같이 하는 것입니다.Nonnull
에 대한 주석도indirectPathToA()
(전제조건의 설명).가능성 2는, 다음의 무효를 확인하는 것입니다.y
에indirectPathToA()
에의 콜을 회피한다.directPathToA()
언제y
null 입니다.
public void indirectPathToA(Integer y){
directPathToA(y);
}
Kotlin을 사용하면 컴파일러에서 이러한 nullability 주석을 지원하므로 null 이외의 인수를 필요로 하는 Java 메서드에 null을 전달할 수 없습니다.이 질문은 원래 Java를 대상으로 했지만, 이 Kotlin 기능에 대해 언급하는 이유는 이러한 Java 주석을 특별히 대상으로 하고 있으며, "이러한 주석을 더 엄격하게 적용 및/또는 전파할 수 있는 방법이 있는가?"라는 질문이었기 때문입니다.이 기능은 이러한 주석을 더 엄격하게 만듭니다.
Java 클래스 사용@NotNull
public class MyJavaClazz {
public void foo(@NotNull String myString) {
// will result in an NPE if myString is null
myString.hashCode();
}
}
Kotlin 클래스가 Java 클래스를 호출하고 @NotNull로 주석이 달린 인수에 대해 null을 전달합니다.
class MyKotlinClazz {
fun foo() {
MyJavaClazz().foo(null)
}
}
가 Kotlin을 강제 하는 중 가 발생하였습니다.@NotNull
석입니니다다
Error:(5, 27) Kotlin: Null can not be a value of a non-null type String
참조: http://kotlinlang.org/docs/reference/java-interop.html#nullability-annotations
자바에서는 Guava의 Optional type을 사용합니다.실제 타입이기 때문에 컴파일러의 사용에 대한 보증을 얻을 수 있습니다.쉽게 우회할 수 있어NullPointerException
이 는 인수로 것이 있는 하게 전달하고 있습니다.
Java 8의 새로운 기능 옵션에서 @Nullable 또는 @Notnull을 자체 코드로 사용하지 마십시오.다음 예를 들어보겠습니다.
public void printValue(@Nullable myValue) {
if (myValue != null) {
System.out.print(myValue);
} else {
System.out.print("I dont have a value");
}
다음과 같이 다시 작성할 수 있습니다.
public void printValue(Optional<String> myValue) {
if (myValue.ifPresent) {
System.out.print(myValue.get());
} else {
System.out.print("I dont have a value");
}
옵션을 사용하면 null 값을 강제로 확인할 수 있습니다.위의 코드에서는 다음 콜을 통해서만 값에 액세스할 수 있습니다.get
★★★★★★ 。
또 다른 장점은 코드가 더 읽기 쉬워진다는 것입니다.Java 9 ifPresentOrElse를 추가하면 함수는 다음과 같이 작성될 수 있습니다.
public void printValue(Optional<String> myValue) {
myValue.ifPresentOrElse(
v -> System.out.print(v),
() -> System.out.print("I dont have a value"),
)
}
언급URL : https://stackoverflow.com/questions/13484202/how-to-use-nullable-and-nonnull-annotations-more-effectively
'programing' 카테고리의 다른 글
Vue-cli 3 - 재료 설계 아이콘 설치 (0) | 2022.07.11 |
---|---|
V-inside v-for - 두 열에 항목 목록 표시 (0) | 2022.07.11 |
a[a[0] = 1은 정의되지 않은 동작을 생성합니까? (0) | 2022.07.11 |
VueX가 변환이 실행되기를 기다립니다. (0) | 2022.07.11 |
vue3의 VueApexCharts 라이브러리에서 데이터와 함께 어레이를 차트에 올바르게 전달하는 방법 (0) | 2022.07.11 |