{JUG Trojmiasto} Groovy - slowo kluczowe "as"

0 views
Skip to first unread message

Mateusz Mrozewski

unread,
Dec 14, 2009, 3:55:36 AM12/14/09
to jug-tro...@googlegroups.com
Witam,
Jedną z rzeczy, której nie byłem w stanie dokładnie wytłumaczyć na
prezentacji była konstrukcja:
import grails.converters.XML
...
def t= Task.get(1)
render t as XML

Ta konstrukcja pozwala nam przekazać klasę domenową (encję) do metody
render jako XML. Zarówno metoda render, klasa domenowa oraz klasa
grails.converters.XML są klasami Grails i zostały tak skonstrukowane,
żeby ta konwersja mogła się odbyć (tj. metoda render wie jak
wyświetlić grails.converters.XML, a klasa domenowa wie jak
"przetłumaczyć się" na grails.converters.XML).

Natomiast samo słowo kluczowe "as" jest cechą Groovy (operatorem). W
Groovy'm każdy operator "pod maską" wywołuje odpowiednią metodę, np. +
wywołuje plus, - wywołuje minus, itp. (tak, można dzięki temu
przeciążać operatory). Operator "as" wywołuje metodę asType(). Żeby
lepiej to zobrazować, mały fragment kodu:

class Bar {
String a

public Bar(String a) {
this.a = a
}

public String toString() {
"[a: " + a + "]"
}
}

Tak wygląda nasza klasa Bar. Klasa Foo wygląda tak:

class Foo {
public Bar asType(Class<Bar> a) {
new Bar("Test")
}
}

W klasie Foo definiujemy metodę asType i oczekujemy jej wywołania z
klasą Bar. Gdy takie wywołanie nastąpi zwracamy nową instancję klasy
Bar (oczywiście w prawdziwym kodzie w tym miejscu nastąpiłaby sprytna
konwersja ;-). Wywołujemy to tak:

class Main {
public static void main(String[] args) {
def f = new Foo()
myRender f as Bar
}

private static void myRender(Bar b) {
println b
}
}

Do metody myRender przekazujemy instancję klasy Bar, która została
utworzona w wyniku konwersji "f as Bar".

pozdrawiam
--
Mateusz Mrozewski
Reply all
Reply to author
Forward
0 new messages