java 자바 어설 션 부족



assertions (8)

assert 키워드가 Java에서 그렇게 미숙한지 궁금합니다. 나는 그들이 사용 된 것을 거의 본 적이 없지만, 그들이 훌륭한 생각이라고 생각한다. 나는 분명히 다음과 같은 간결함을 선호한다.

assert param != null : "Param cannot be null";

자세한 내용은 다음과 같습니다.

if (param == null) {
    throw new IllegalArgumentException("Param cannot be null");
}

내 의혹은 그들이 과소 평가 된 이유는

  • 그들은 상대적으로 늦게 도착했습니다 (Java 1.4). 많은 사람들이 이미 Java 프로그래밍 스타일 / 습관을 수립했습니다.
  • 런타임시 기본적으로 꺼져 있습니다. 이유는 무엇입니까 ??

Joshua Bloch는 "유효성 검사 매개 변수"항목에서 공용 메서드에 대해 (일종의 간단한 규칙을 채택하는 것과 같이) 인수를 확인하고 유효하지 않다고 판단되는 경우 필요한 예외를 throw한다고 제안했습니다. 비 공개 메소드 (공개되지 않고 사용자가 유효성을 확인해야하는 경우) 대신에 어설 션을 사용할 수 있습니다.


어설 션 은 이론 상으로는 invariants 을 테스트하기 위해 코드가 제대로 완료 되려면 반드시 가정 해야합니다 .

표시된 예는 유효한 입력에 대한 테스트입니다. 일반적으로 사용자가 제공하기 때문에 어설 션의 일반적인 용도는 아닙니다.

어설 션은 일반적으로 프로덕션 코드에서 사용되지 않습니다. 왜냐하면 오버 헤드가 있기 때문에 인바 리언트가 실패한 상황이 개발 및 테스트 중에 코딩 오류로 포착 된 것으로 가정합니다.

자바에 "늦게"오는 것에 대한 당신의 요지는 또한 그들이 더 널리 알려지지 않은 이유이기도합니다.

또한 단위 테스트 프레임 워크를 사용하면 프로그래밍 방식의 어설 션이 테스트중인 코드 외부에 있어야 할 필요성이 생깁니다.


어설 션을 사용한 프로그래밍에서

기본적으로 어설 션은 런타임에 비활성화됩니다. 두 개의 명령 줄 스위치를 사용하여 어설 션을 선택적으로 활성화 또는 비활성화 할 수 있습니다.

즉, 런타임 환경을 완벽하게 제어 할 수 없다면 어설 션 코드가 호출되는 것을 보장 할 수 없습니다. 어설 션은 프로덕션 코드가 아닌 테스트 환경에서 사용하기위한 것입니다. 어설 션을 사용 안함 ( 기본값 ) 으로 응용 프로그램을 실행하면 모든 오류 처리 코드가 사라지기 때문에 예외 처리를 어설 션으로 바꿀 수 없습니다.


어설 션은 매우 제한적입니다. 부울 조건 만 테스트 할 수 있으며 매번 유용한 오류 메시지에 대한 코드를 작성해야합니다. 이를 JUnit의 assertEquals ()와 비교하면 입력에서 유용한 오류 메시지를 생성하고 JUnit 러너의 IDE에서 두 입력을 나란히 표시 할 수 있습니다.

또한, 지금까지 본 모든 IDE에서 단정을 검색 할 수는 없지만 모든 IDE는 메소드 호출을 검색 할 수 있습니다.


사실 그들은 자바 1.4에 도착했다.

주요 문제는 Eclipse 또는 J2EE 서버에서 직접 jvm 옵션을 직접 관리하지 않는 환경에서 코드를 작성할 때입니다 (두 경우 모두 jvm 옵션을 변경하는 것이 가능하지만 어디에서 찾을 수 있는지 깊이 조사해야 함). 할 수있다.), if (예외를 사용하는 것이 나쁘다)를 사용하는 것이 더 쉽다.


@Don, 어설 션이 기본적으로 해제되어 있으면 좌절감을 느낍니다. 나는 또한이 작은 javac 플러그인을 작성하여 (즉, if (!expr) throw Ex 대한 바이트 코드를 내 보낸다.)이 어리석은 assert 바이트 코드보다는 if (!expr) throw Ex .

Java 코드를 컴파일하는 동안 classpath에 fa.jar 을 포함 fa.jar 마법을 수행 한 다음

Note: %n assertions inlined.

@smallwiki.unibe.ch/adriankuhn/javacompiler/forceassionsions 및 github https://github.com/akuhn/javac


어설 션은 다음과 같은 이유로 유용합니다.

  • 초기에 PROGRAMMING 오류를 잡으십시오.
  • 코드를 사용한 문서 코드

그것들을 코드 자체 검증이라고 생각하십시오. 실패 할 경우 프로그램이 망가져 중단되어야 함을 의미합니다. 단위 테스트 중에 항상 켜십시오!

Pragmatic Programmer 에서는 프로덕션 환경에서 실행하도록 권장합니다.

어설 션을 켠 상태로 둡니다.

어설 션을 사용하여 불가능 성을 방지하십시오.

어설 션은 실패 할 경우 AssertionError를 발생 시키므로 catch Exception에 의해 catch되지 않습니다.


나는 어설 션을 쓰고 나서 조건문을 표준으로 바꿔야하는 이유에 대해 확신 할 수 없다. 처음에는 if를 조건으로 쓰지 않는 이유는 무엇일까요?

어설 션은 테스트 용이며 두 가지 부작용이 있습니다. 더 큰 바이너리와 사용 가능한 경우 성능이 저하됩니다 (이 기능을 사용하지 않도록 설정할 수 있습니다).

어설 션은 런타임에 어설 션이 활성화 / 비활성화 될 때 앱의 동작이 다르다는 것을 의미하므로 조건의 유효성을 검사하는 데 사용하면 안됩니다. 이는 악몽입니다!





assertions