2012-10-29 10 views
8

Metody rozszerzania C# są świetne do dodawania cukru syntaktycznego. Metody rozszerzania Java są świetne, aby umożliwić programistom bibliotek dodawanie metod do ich interfejsów.Czy Java ma sposób, aby programiści spoza biblioteki mogli używać metod rozszerzeń?

Jestem nie-bibliotecznym programistą Java i wiem, że będę czerpał wiele korzyści z pozyskiwania nowych funkcji z bibliotek, ale nadal chciałbym mieć możliwości syntaktycznego cukru metodami C#.

Czy to możliwe, czy będzie to możliwe w przyszłych wersjach Javy?

np: Chciałbym dodać metody do klasy String ...

String data = StringUtils.capitalize("abcd"); // instead of this 
String data = "abcd".capitalize() // I would like to do this 

proszę nie koncentrują się na tym konkretnym przykładzie, ja tylko pokazuje klasę funkcjonalności Chcę, aby móc osiągać.

+0

Java nie ma mechanizmu "śmiertelników" dla rozszerzonych zajęć w ten sposób. Istnieje kilka sztuczek, które można grać za pomocą niektórych narzędzi do debugowania, ale nie są one przeznaczone do użycia poza scenariuszem debugowania. –

+1

Należy zauważyć, że ogólnie nie ma twardej granicy pomiędzy "programistami bibliotek" i "programistami aplikacji" (przynajmniej w świecie Java). Jeśli dana funkcja jest dostępna dla bibliotek, może być również używana w aplikacjach. To prawda, złożoność niektórych funkcji sprawia, że ​​jest ona bardziej przydatna w bibliotekach. Na przykład: * pisanie * Interfejsy API, które dobrze wykorzystują generyczne w złożonych scenariuszach, są bardzo trudne, więc zwykle odbywa się to tylko w bibliotekach (wielokrotnego użytku). * używanie * takich interfejsów API jest znacznie łatwiejsze (jeśli interfejsy API są dobrze zaprojektowane). –

Odpowiedz

5

Java nie ma tej funkcji, ani nie jest prawdopodobne, aby miała ona w najbliższym czasie.

Groovy ma jednak numer very similar feature i działa również na JVM. Być może to opcja.

+0

Dzięki Sean. Próbowałem Groovy kilka lat temu (pre Java 7), i znalazłem to zbyt wolno. Udało mi się przyspieszyć działanie, sprawiając, że mój kod nie był tak zgrubny, ale wciąż był 10 razy wolniejszy. Więc po prostu wróciłem do Javy. Powinienem spróbować ponownie z Javą 7, żeby sprawdzić, czy napotkam na te same problemy, ale myślę, że przeczytałem, że Groovy jest wciąż 10 razy wolniejszy niż Java i nie stać mnie na 10x więcej sprzętu! –

+0

@BobThule: Groovy jest dużo szybszy tego dnia i co ciekawe, Java 7 odegrała w tym dużą rolę (poprzez 'invokedynamic'). –

2

Podejrzewam, że myślisz o planowanym dodatku do Javy 8, który pozwoli ci dodawać metody z domyślnymi implementacjami do interfejsu - abyś mógł dodawać nowe metody bez łamania całego istniejącego kodu. Jest to użyteczne tylko wtedy, gdy kontrolujesz typ interfejsu - więc nie będzie on użyty dla String, ponieważ String nie jest interfejsem.

+0

Cześć Louis, prawda, ale metody rozszerzenia C# pozwalają na dodawanie metod do klasy - to tylko cukier syntaktyczny, ale tworzy ładny kod i szybszy rozwój, ponieważ kodowanie może zaoferować metody. Wierzę, że programiści JDK najpierw modelowali metody rozszerzenia Java z C#, ale potem zobaczyli, że nie rozwiąże to problemów, przed którymi stanęli twórcy bibliotek, i tak przekształcili go w to, czym jest teraz - co jest naprawdę świetnym rozwiązaniem, ale nie jest to szczególnie przydatne dla programistów końcowych, którzy próbują poprawić swój kod. –

+0

Eh. Osobiście bardzo popieram ograniczenia, jakie ludzie z java wprowadzają w metodach rozszerzających Java 8 - mówiąc o projektowaniu bibliotek, mam bardzo mieszane uczucia, że ​​końcowi programiści mogą dodawać dowolne metody do typu. –

+0

Myślę, że metody rozszerzenia java 8 są świetne i nie chciałbym stracić ich funkcjonalności. Jest to kwestia preferencji i nie próbowałbym powiedzieć, że jesteś w błędzie, jeśli chcesz mieć dużo wywołań statycznych metod ukrytych w klasach narzędziowych, ale wolę wywoływać metody bezpośrednio na moich obiektach.Myślę, że jest czystszy, bardziej czytelny i wygląda bardziej obiektowo. A w przypadku większości innych języków będących w stanie używać różnych metod/metod/rozszerzeń, chciałbym móc zrobić to samo z Javą. Co słychać u String nie posiadającego bogatszego zestawu metod członkowskich? Zwłaszcza, że ​​jest to ostatnia klasa? –

Powiązane problemy