2009-11-20 4 views
0

클로저 (FCM)와 제네릭을 결합하면 완전한 유형 안전 기준을 가질 수 있습니다.클로저는 완전히 유형 안전 기준을 의미합니까?

// The following works without a cast as Foo.id is a 'long' field. 
List<Long> ids = session.createCriteria(Foo.class) 
         .setProjection(Foo#id) 
         .list(); 

// The following is a compilation error, as Foo.bar is defined as an int, and not a string 
session.createCriteria(Foo.class) 
     .addRestriction(Restrictions.eq(Foo#bar,"blah")) 
     .list(); 

유형 안전 기준에 대한 JPA 2.0 스펙을 읽었습니다. 그러나 여전히 다소 부족합니다.

게다가 여기서는 코드의 유형 안전성을 전반적으로 향상시키는 기준으로 여기에 기준을 사용하고 있습니다. 자바의 정적 유형 지정을 사용하여 코드를 더 빨리 처리 할 수있었습니다. 하지만 결과적으로 지금은 물어 뜯고 타이핑을 무시하는 코드의 부분을 사용하게됩니다. 예를 들어 HQL 쿼리.

+0

내가 바로 잡아 보자. 2 일 전에 클로저가 자바의 일부가 될 것이라고 발표되었고 이것이 JPA 쿼리 작성에 어떻게 영향을 주길 원합니까? 나는 지역 사회의 어느 누구도 FCM 스타일 폐쇄의 파급 효과를이 정도까지 해결했다고 생각하지 않습니다. – rtperson

답변

2

설명하는 코드는 클로저를 사용하지 않고 필드 리터 (method literals)입니다. 좋은 옛날처럼 class literal. 이것들은 criteria API에서 도움이 될 수 있습니다. 형식 안전 쿼리 인터페이스 용 JPA 2 source code generation work-around은이 형식으로 바꿀 수 있습니다. 인 경우 JDK7의 일부가됩니다.

+0

감사합니다. 나는이 문제에 대해 두 번째 눈빛을보고 싶었습니다. "클로저 사용"은 FCM과 함께 사용되는 필드 리터럴을 의미합니다. 썬이 그 제안을 고수하기를 바란다. 그것은 테이블에 단순히 닫히는 것보다 더 많은 것을 제공하기 때문이다. – DragonFax

1

Thomas가 지적한대로 엄격하게 폐쇄가 필요하지는 않습니다. 아무리 많은 제안이 무엇을보고 있는지 알지 못한다면, 순간적으로 모두 공중에 올라와 있습니다. FCM이 실제로 제안의 기초인지는 분명하지 않습니다. 특히 Stephen Colebourne이 발표 내용에 대해 누구보다 놀라워하는 것처럼 보입니다.

클로저가 취할 수있는 것이 무엇인지 힌트로 많은 사람들이 Neal Gafter's mysteriously-revised-more-or-less-right-as-the-Devoxx-presentation-announcing-closures-was-being-given spec을 가리키고 있습니다. FCM과 비슷하게 수정 된 제안서가 (미학적으로) 보입니다.

이 스펙에는 참조하는 참조의 종류 (위의 '메소드 참조'아래)가 포함되어 있으며 물론 FCM은 동일합니다. 예, 이것은 분명히 당신에게 가능한 제안을 할 것입니다. 이 점을 읽었을 때 가장 먼저 생각한 것은 JPA/Hibernate 및/또는 우리 주변의 추상화 레이어에 어떤 영향을 미치는지에 관한 것이었다. 당신의 기준에서 타입 안전하고, refactorable 메소드 참조? 그럼 당연하지.

+0

메소드 리터럴 (일부 제약 조건 포함)은 레코더로 구현하기가 어렵지 않습니다 (easyMock 참조). 필드 리터럴은 더 어렵습니다 (JPA2 참조). Java에 메소드와 리터럴이없는 이유는 없습니다. 심지어 javadoc이 있습니다. –