2009-10-23 17 views
6

Lamdbaj umożliwia definicję zamknięć w języku Java, różne przykłady można znaleźć heremechanizmy Java na zastosowania w zamknięciach lambdaj

Mam pytanie dotyczące podstawowych mechanizmów Java przy użyciu, na przykład, aby zdefiniować println zamknięcie, stosuje się następującą Kod:

Closure println = closure(); 
{ of(System.out).println(var(String.class)); } 

zamknięcie może być następnie realizowana przez:

println.apply("foobar"); 

Jestem ciekawy, jakie mechanizmy w Javie pozwoliłyby na połączenie z of(...).println(...), aby zostało skojarzone z samą instancją println.

Oczywiście, kod źródłowy lambdaj jest dostępny do odczytu, ale miałem nadzieję na nieco wyższy poziom wyjaśnienia, jeśli ktoś go ma. Moje umiejętności w zakresie refleksji sięgają nawet introspekcji i dynamicznego wykonywania metod.

+0

jestem brakuje "zamknięcie" bit? Widzę metodę zniesioną, ale to wszystko. : -/ –

+1

W rzeczywistości Lambdaj nie obsługuje zamknięć. W szczególności nie może przechwycić zmiennych z otaczającego zakresu. –

Odpowiedz

2

Cóż, of to prawdopodobnie metoda static, która jest importowana statycznie, dzięki czemu można ją wywołać bez nazwy klasy. Spodziewam się, że var jest taki sam. Obie metody musi wrócić pewnego rodzaju metody, które mają następnie nazywa się:

public class Printable { 
    public void println(Var var); 
} 

public class Fac { 
    public static Printable of(Object o) { 
    return new Printable(o); 
    } 

    public static Var var(Class<?> clazz) { 
    return new Var(clazz); 
    } 

} 

Nagle:

Fac.of(System.out).println(Fac.var(String.class)); 

jest ważny Java. Korzystanie z importu statycznych, hej presto:

import static Fac.*; 

of(System.out).println(var(String.class)); 

W kręcone szelki są oczywiście ważne Java, jak można dodać te w żaden sposób, aby pomóc w określeniu leksykalny SopE. Ten styl projektowania interfejsu API nosi nazwę fluent i najlepiej jest go zaprezentować w bibliotece testowej JMock.

Nawiasem mówiąc, jeśli ma to na celu wprowadzenie zamknięć do Javy, jest to dość absurdalne - składnia jest nieczytelna . Ich przykład I/O naprawdę rozśmieszył mnie na głos. Wypróbuj Scala!

EDIT - dwie println połączenia są związane wierzę, ponieważ pierwsza sekwencja połączeń pozwalają biblioteki uchwycić zmienne, które zostały przekazane jako parametry. Prawdopodobnie są one przechwytywane w pewnej strukturze ThreadLocal. Po wywołaniu metody (również przypuszczalnie statycznej) println biblioteka używa tych przechwyconych danych, aby faktycznie wykonać to zachowanie w późniejszym czasie. Również testy związane z testem EasyMock używają podobnego mechanizmu (który używa proxy Java w tle) do przechwytywania oczekiwanych wartości.

+3

+1. Po 3 latach nauki w C++ myślałem, że wiem o brzydkich zamknięciach, ale * Bóg wszechmogący * ... –

+0

Dzięki, rzeczywiście przerzuciłem się na Scalę przez większość mojego aktywnego rozwoju. To nadal mnie wprawia w zakłopotanie, rozumiem statyczny element importu, moje zdziwienie jest takie, że wywołanie (...). Println (...) jest w jakiś sposób związane z instancją "println" zdefiniowaną przed nią, w moim przykładzie otwarcia . –

+0

OK - Edytowałem swoją odpowiedź, ponieważ wydaje mi się, że wiem, jak to się dzieje. –

10

Jestem Mario Fusco i jestem głównym programistą biblioteki lambdaj.

Przede wszystkim chciałbym wyjaśnić coś: lambdaj nie ma zastąpić żadnego języka funkcjonalnego. Jak powiedziałem w zeszłym tygodniu w moim przemówieniu w Dzbanku w Zurychu, jeśli masz szansę skorzystać z Scali, idź na nią i nigdy nie oglądaj się za siebie.Tutaj można znaleźć CV mojego przemówienia, gdzie jest wyraźnie powiedziane, że:

http://ctpjava.blogspot.com/2009/10/lambdaj-new-trends-in-java.html

Jestem zadowolony Scala deweloper też. Ale czasami jesteś po prostu zobowiązany do rozwijania się w Javie (z mojego doświadczenia, w świecie rzeczywistym, około 80% przypadków, w których nie możesz wybrać języka, w którym chcesz napisać swój kod) iw tym przypadku niektóre z cech lambdaj mogą być pomocne (lub mam taką nadzieję). Chciałem tylko przynieść do Javy niektóre funkcjonalne funkcje, których kompletnie brakuje. Oczywiście wynik nie jest w pełni satysfakcjonujący, głównie ze względu na ograniczenia nałożone przez samą Javę.

Jeśli chodzi o wewnętrzny mechanizm lambdaj, tak używa ThreadLocal, aby osiągnąć ten wynik. Jeśli masz inne pytania, ciekawostki, a nawet lepsze sugestie i konstruktywną krytykę około lambdaj może mógłbyś być zainteresowany, aby zarejestrować się do listy mailingowej lambdaj tutaj:

http://groups.google.com/group/lambdaj

Bye Mario

Powiązane problemy