2013-09-24 1 views
12

Groovy의 콜렉션에서 사용되었을 때 최근에 GStringImpl s 대 String의 동작에 대해 읽었습니다.Groovy GStringImpl 및 String 동작

가 나는 이유가 있다면하지만 궁금 해서요,이 false로 평가하는 이유 ...

"${'test'}".equals("test") == false

.equals() 계약의 대칭 요구 사항 때문이라고 이해 GStringImpl는 할 수 없었다 즉시 String으로 평가하십시오. 나는이 GStringImpl을하지 않는

"${'someString'}"

이런 일을 ... 할 때, 난 그냥 즉시 예를 들어, 맵에 키로 사용할 수 다시 일반 자바 String를 얻을 .

String s = "${'someString'}"

같은 내가 어떤 해결 방법이 알고

그러나이 같은 물건은 조금 불편하고, GStringImplString 사이의 호환 문제는 '잡았다'큰 그루비 newbees이 될 것으로 보인다.

답변

15

GStrings은 주로 지연된 평가 (로깅에 상당히 유용함)와 템플리트와 관련된 몇 가지 이유로 인해 String으로 즉시 평가되지 않습니다. Strings and GString에서 당신은 좋은 설명을 찾을 수 있습니다 : 그것은 방법은 G 스트링이을 평가하는 것이 호출() 있으며, toString 때까지하지 그래서

GString게으른 평가를 포함 할 수있다. 이 게으른 평가 은 문자열의 계산, 값에 대한 toString() 호출 및 다른 문자열의 연결 이 지연되는 경우 지연되도록 유용하므로 로깅과 같은 작업에 유용합니다.

템플릿 엔진, 을 사용하고 싶지 않거나 GStrings를 전체적으로 느리게 평가하고자 할 때 GString은 매우 편리합니다. 어떤 GString에 임베디드 변수, toString() 그 변수에 문자열 표현을 얻기 위해 호출하고 최종 문자열에 삽입이야.

따라서 :

G 스트링과 스트링은 두 가지 클래스, 그리고 문자열 와 결합 따라서 예기치 않은 결과를 생성 할 수 있습니다,지도 개체 또는 객체를 G 스트링과 관련된 비교에 대한 키로 G 스트링의 객체를 사용 GString과 String은 같은 hashCode를 갖지 않을 것이고 이기 때문에 객체가 같을 것입니다. 두 개의 유형 간에는 비교 또는 맵 키가 자동으로 강제 변환되지 않으므로 은 GString 객체에서 명시 적으로 toString()을 호출해야 할 때가 있습니다.

예기치 않은 문자열 변환으로 인해 코드가 인 경우 groovy.sql 클래스의 메소드와 같이 GString이 필요합니다.

+0

충분합니다. 설명 해줘서 고마워. – rcgeorge23

+0

GStringImpl 클래스를 동적으로 확장하여 생성시 .toString()을 자동으로 호출 할 수 있습니까? –