Groovy 2.0에서 optional static checking을 트리거하는 클래스 또는 메소드에 TypeChecked
주석을 추가 할 수 있습니다.Groovy mixed typing
나는 그런 것들이 어떻게 작동하는지 혼란 스럽다는 것을 인정해야한다. 이 기사에서는 간단한 예제를 제공합니다.
@TypeChecked
Date test() {
// compilation error:
// cannot assign value of Date
// to variable of type int
int object = new Date()
String[] letters = ['a', 'b', 'c']
// compilation error:
// cannot assign value of type String
// to variable of type Date
Date aDateVariable = letters[0]
// compilation error:
// cannot return value of type String
// on method returning type Date
return "today"
}
이 경우 일부 검사가 실패합니다. 그러나 일반적으로, 검사 된 타입 B
안에, 타입이 체크되지 않은, 메소드 A
의 리턴 값을 사용할 것입니다. 이 경우에는 컴파일러가 메서드 B
형식이 일관되는지 여부를 알아낼 수있는 방법이 표시되지 않습니다.이 메서드는 A
메서드의 반환 값에 대한 정보가 충분하지 않기 때문입니다.
일반적으로 유형 안전성을 유지하면서 코드 서브 세트에서 유형 확인을 사용하려면 어떻게해야합니까?
편집
나는 예를 만들려고. 내가 늙은 클래스를
class Old {
public getFoo() {
return 1
}
}
을 가지고
@TypeChecked
class New {
int doubleFoo() {
return 2 * (new Old().foo)
}
}
컴파일러와 같은 유형 검사 코드에서 사용하려고하면 단지 무엇을 알고, 나는 그것이 실패합니다 생각하지 않습니다 무엇 컴파일 (Groovy2를 점검 할 작업에 여기에 설치하지 않았습니다). 그러나이 경우 Groovy2 이전에 작성된 코드를 사용하는 것이 문제가됩니다. 그래서 나는 더 정교한 것이 행해졌다고 생각하지만, 나는 무엇을 확신 할 수 없다.
사실, typechecked되지 않는 전형적인 그루비 클래스는'def foo() {1}'과 같은 것을 가질 것입니다. AFAIK, 이것은'Object'를 반환하는 것과 같아야합니다. 자, 예를 들어,이 결과를'int' (또는'Integer', boxing 후)를 기대하는 typechecked 메소드에 넣으려고하면, 타입 검사기가 불평 할 것입니다. – Andrea
Groovy에 대한 내 경험이 대표적인 것은 아니지만, 리턴 타입을 명시 적으로 선언하지 않고'def'를 사용하는 많은 코드를 발견했습니다. 어떤 경우라도 Groovy 1에서 반환 형식을 선언하면 런타임에 형식 검사를하지 않아 코드가 더 이상 안전하지 않게되고 결과적으로 인해 버그가 숨겨지기 때문에이 방법을 사용하는 것이 좋습니다. 주조가 더 느리다. – Andrea
동적 언어는 대개 조금 더 느립니다. groovy는 빠른 동적 언어이므로 사례를 확인해야합니다. 최대 성능이 필요합니까? groovy를 사용하여 웹 애플리케이션을 2 년 동안 사용해 왔습니다. 대부분의 문제는 JPA에서의 높은 JSF 1.2 메모리 사용 및 잘못된 매핑에서 비롯되었습니다. 최대의 성능이 필요하면'@ CompileStatic'. 타입 검사가 필요하다면, 당신이 당신의 메소드의 서명을 입력해야한다는 것이 옳다고 생각합니다. 그렇지 않으면'def'로 갈 수 있습니다. 귀하의 경우, 컴파일러는 메서드의 반환 형식을 유추 생각하지 않습니다. 어쩌면 JIRA를 채우고 있을까요? – Will