2017-10-13 25 views
0

예 : Java의 기본 계약 확인이 있습니까? 해시 코드와 equals 함수 사이의 계약?Java의 계약 확인 - 내장? 예 : 해시 코드/동등한

이 질문에 대해서는 hashcode/equals 계약을 예로 들겠습니다.하지만 저는 일반적으로 계약 체킹에 관심이 있습니다. 나는 같고 해시 코드가 자바에서 "계약"만족해야하는 여러 장소에서 읽고 :

  • 같음이
  • 동일 개체를 반복 호출에 일치해야합니다 또한 equivalence relation의 세 가지 규칙을 준수해야합니다은 동일한 해시 코드를 의미한다

나는 조건을 이해하며, 나에게 의미가있다. 그러나 궁금한 점은 개발자가 버그 코드를 작성하지 않겠다는 본질적으로 강력한 가이드 라인이 종이에 적혀있는 것인가 아니면 컴파일 타임 또는 런타임 예외로 Java에서 발견 할 수있는 것인지 궁금합니다.

+1

컴파일 타임이나 런타임 예외로 Java에서 발견되지 않습니다. (코드 작성) cont에 충실 ract. – nbokmans

+0

같으면 같은 해시 코드를 암시하지 않으면 이상한 동작이 발생할 수 있습니다. 예 : 동일한 객체가 해시 맵의 다른 버킷에 매핑 될 수 있습니다. –

+0

고마워요. 그게 내가 생각했던거야. 따라서 기본적으로 Java에 대한 맹목적인 코드를 작성하지 않는 것이 좋습니다.하지만 계약을 위반하는 프로그램을 이론적으로 작성할 수는 있지만 수년 동안 버그없이 컴파일되고 실행될 수 있습니다. 명백 해졌다. –

답변

1

컴파일 타임에는 적용되지 않습니다.

일부 클래스는 런타임에 동작을 적용 할 수 있습니다. 예를 들어, 동일한 두 객체가 동일한 해시 코드를 갖거나 예외를 보내는 지 확인하는 메소드를 작성할 수 있습니다.

또한 권장 계약에서 벗어나는 경우가 있습니다.

+0

감사합니다. 이 계약의 편차가 실제로 바람직한 것이 아닌가하는 것을 본다면 정말 관심이 있습니까? –

+0

예를 들어'Comparable'은'compareTo'가'equals'와 일치 할 것을 강력히 추천합니다 (즉, (a.compareTo (b) == 0) == (a.equals (b)'). https://stackoverflow.com/a/14534751/829571 – assylias

1

그것은 아니다 (그리고 할 수 없음) 컴파일 또는 런타임 (명시 적으로 확인하는 경우를 제외하고 자동으로 잡은

간단한 카운터 예 :. 그것을하는 것이 좋습니다 그러나

public boolean equals(Object other){ 
    return new Random().nextInt(3) == new Random().nextInt(3); 
} 

public int hashCode() { 
    return new Random().nextInt(3); 
} 

이러한 계약을 검사하는 단위 테스트를 생성합니다. 심하게 구현 된 equals/hashcode를 사용하여 발견하기 어려운 버그가 발생했습니다.

+0

예. 더 생각해 보면 자동으로 잡힐 수 없다는 것을 깨닫게됩니다. 프레임 워크에서 Java by correct-by-construction 디자인 컴파일 타임에이 계약 위반을 검사하는 프레임 워크가 있는지 궁금합니다. 흥미로운 프로젝트가 될 것입니다 –

+1

그 방향으로 뭔가 관심이 있다면 https : //en.wikipedia.org/wiki/Java_Modeling_Language –

+0

아주 재미 있습니다. Hoare triples와 같은 방식으로 이러한 연락처를 최소한 자연스럽게 지정할 수있게 해주는 것 같습니다. 그러면이 단어가 런타임 어설 션으로 변환됩니다.나는 JML 스펙을 컴파일 할 때 YES/NO 응답을 줄 수있는 툴을 쓰는 것이 가능할 것이라고는 생각하지 않는다. 아마도 컴퓨터 과학에서 일반적으로 사용되는 대부분의 것들처럼 결정 불가능한 문제 일 것이다. 어쨌든, 매우 흥미 롭습니다. 업계가 더 많이 사용하고 싶다는 소망. –