주석 우리 모두 알고 있듯이 이 기능은 Java5부터 추가되었으며 현재는 프로그램 구성을 단순화하기 위해 많은 프레임워크에서 널리 사용됩니다. 그렇다면 논쟁의 여지가 있는 유형 주석은 정확히 무엇입니까? 복잡하거나 편리합니까?
1. 유형 주석이란 무엇입니까?
Java 8 이전에는 Java 8의 클래스, 메서드, 속성과 같이 선언된 위치에서만 주석을 사용할 수 있었습니다.
클래스 인스턴스 생성
다음과 같이 코드를 복사합니다. new @Interned MyObject();
유형 매핑
다음과 같이 코드를 복사합니다. myString = (@NonNull String) str;
구현 문에서
다음과 같이 코드를 복사합니다. class UnmodifyingList<T> Implements @Readonly List<@Readonly T> { ... }
예외문 던지기
다음과 같이 코드를 복사합니다. void monitorTemperature() throws @Critical TemperatureException { ... }
유형 주석은 의미론이 아닌 구문일 뿐이며 Java의 컴파일 시간, 로딩 시간 및 실행 시간에 영향을 미치지 않습니다. 즉, 유형 주석은 클래스 파일로 컴파일될 때 포함되지 않습니다.
2. 유형 주석의 역할
먼저 다음 코드를 살펴보세요.
다음과 같이 코드 코드를 복사합니다.
Collections.emptyList().add("하나");
int i=Integer.parseInt("hello");
System.console().readLine();
위의 코드는 성공적으로 컴파일되지만 실행 시 UnsupportedOperationException; NullPointerException이 각각 보고됩니다.
유형 주석은 Java 프로그램에서 강력한 유형 검사를 지원하는 데 사용됩니다. 플러그인 검사 프레임워크를 사용하면 컴파일 중에 런타임 오류를 감지하여 코드 품질을 향상시킬 수 있습니다. 이것이 유형 주석의 역할입니다.
3. 프레임워크 확인
Check 프레임워크는 타사 도구이며 Java의 유형 주석 사용 효과는 1+1>2입니다. 이는 javac 컴파일러에 내장되어 ant 및 maven과 함께 사용되거나 Eclipse 플러그인으로 사용될 수 있습니다. 주소는 http://types.cs.washington.edu/checker-framework/입니다.
확인 프레임워크는 유형 주석이 나타나는 위치를 찾아 이를 확인할 수 있습니다. 다음은 간단한 예입니다.
다음과 같이 코드 코드를 복사합니다.
import checkers.nullness.quals.*;
공개 클래스 GetStarted {
무효 샘플() {
@NonNull 객체 ref = new Object();
}
}
javac를 사용하여 위 클래스를 컴파일합니다.
다음과 같이 코드 코드를 복사합니다.
javac -processor checkers.nullness.NullnessChecker GetStarted.java
컴파일이 통과되었지만 다음과 같이 수정된 경우:
다음과 같이 코드 코드를 복사합니다.
@NonNull 객체 참조 = null;
오류를 감지하기 위해 유형 주석을 사용하지 않으려는 경우 직접 javac GetStarted.java를 컴파일하고 전달할 수 있습니다. 이는 유형 주석 지원 버전이 있는 Java 8에서는 가능합니다. Java 5, 6 및 7 버전 javac 컴파일러는 @NonNull이 무엇인지 모르지만 검사 프레임워크에는 null이 아닌 유형 주석에 /**/를 주석으로 추가하는 이전 버전과 호환되는 솔루션이 있기 때문입니다.
, 예를 들어 위의 예는 다음과 같이 수정됩니다.
다음과 같이 코드 코드를 복사합니다.
import checkers.nullness.quals.*;
공개 클래스 GetStarted {
무효 샘플() {
/*@NonNull*/ 개체 참조 = null;
}
}
이러한 방식으로 javac 컴파일러는 주석 블록을 무시하지만 검사 프레임워크의 javac 컴파일러는 null이 아닌 오류도 감지할 수 있습니다.
유형 주석 + 검사 프레임워크를 통해 이제 컴파일 타임에 런타임 오류를 찾을 수 있음을 알 수 있습니다.
4. JSR 308 소개
JSR 308은 Java 1.5 주석에서 발생하는 두 가지 문제를 해결하려고 합니다.
1. 주석의 구문적 제한: 주석은 선언된 위치에만 작성할 수 있습니다.
2. 타입 시스템의 의미론적 한계: 타입 시스템은 모든 버그를 예방할 수는 없습니다.
JSR 308은 다음 방법을 통해 위의 두 가지 문제를 해결합니다.
1. 주석이 더 많은 위치에 나타날 수 있도록 Java 언어의 구문을 확장합니다. 포함 사항: 메소드 수신자, 일반 매개변수, 배열, 유형 변환, 유형 테스트, 객체 생성, 유형 매개변수 바인딩, 클래스 상속 및 throws 절. 실제로 이는 Java 8의 기능인 유형 주석입니다.
2. 플러그형 시스템을 도입하면 더욱 강력한 Annotation Processor를 만들 수 있습니다. 유형 검사기는 유형 한정 주석을 사용하여 소스 코드를 분석하고 불일치와 같은 오류가 발견되면 경고 메시지를 생성합니다. 실제로는 체크 프레임워크입니다
어떤 사람들은 JSR308이 더 복잡하고 정적이라고 생각하여 반대합니다.
다음과 같이 코드를 복사합니다. @NotEmpty List<@NonNull String> strings = new ArrayList<@NonNull String>()>
다음과 같이 동적 언어로 변경합니다.
다음과 같이 코드를 복사합니다. var strings = ["one", "two"];
어떤 사람들은 최종 분석에서 코드가 "가장 기본적인" 문서라는 데 동의합니다. 코드에 포함된 주석은 코드를 작성한 사람의 의도를 명확하게 나타냅니다. 제때 업데이트되지 않거나 누락된 내용이 있는 경우 주석에 포함된 의도된 정보가 다른 문서에서 손실될 가능성이 가장 높습니다. 또한 런타임 오류를 컴파일 단계로 전송하면 개발 프로세스 속도가 빨라질 뿐만 아니라 테스트 중 버그 확인 시간도 절약됩니다.
5. 요약
특히 동적 언어가 대중화되는 오늘날에는 모든 사람이 이 기능을 좋아하는 것은 아닙니다. 다행히 Java 8에서는 모든 사람에게 이 기능을 사용하도록 강요하지 않습니다. 반대하는 사람들은 이 기능을 사용할 수 없지만 코드 품질에 대한 요구 사항이 더 높은 사람들도 있습니다. 회사는 JSR 308을 채택할 수 있습니다. 결국 코드는 "가장 기본적인" 문서입니다. 나는 이 문장에 동의합니다. 코드가 늘어나더라도 코드를 더욱 표현력있게 만들 수 있습니다. 모든 사람은 이 기능에 대해 자신의 의견을 가지고 있습니다. .