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