2012-10-29 11 views
8

I metodi di estensione di C# sono ottimi per aggiungere zucchero sintattico. I metodi di estensione Java sono ottimi per consentire agli sviluppatori di librerie di aggiungere metodi alle loro interfacce.Java ha un modo per gli sviluppatori non di libreria di utilizzare i metodi di estensione?

Sono uno sviluppatore Java non librerie e so che otterrò molti vantaggi dall'acquisizione di nuove funzionalità dalle librerie, ma mi piacerebbe comunque avere le capacità sintattiche di estensione dei metodi di estensione C#.

È questo o sarà possibile nelle versioni future di Java?

esempio: Vorrei aggiungere metodi alla classe String ...

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

Si prega di non concentrarsi su questo particolare esempio, sto mostrando solo la classe di funzionalità che voglio essere in grado di raggiungere.

+0

Java non ha un meccanismo per "mortali" per le classi estese in questo modo. Ci sono alcuni trucchi che possono essere giocati con alcuni strumenti di debug, ma non sono pensati per l'uso al di fuori di uno scenario di debug. –

+1

Si noti che in generale non esiste un confine rigido tra "sviluppatori di librerie" e "sviluppatori di applicazioni" (almeno nel mondo Java). Se una determinata funzione è disponibile per le librerie, può essere utilizzata anche nelle applicazioni. Certo, la complessità di alcune funzionalità rende più probabile l'utilizzo nelle librerie. Ad esempio: * scrivere * API che fanno buon uso di generici in scenari complessi è molto difficile, quindi di solito è fatto solo in librerie (riutilizzabili). * usare * tali API è molto più semplice (se le API sono ben progettate). –

risposta

5

Java non ha questa funzionalità, né è probabile che sia disponibile in qualsiasi momento presto.

Groovy tuttavia ha uno very similar feature e viene eseguito anche sulla JVM. Forse è un'opzione.

+0

Grazie Sean. Ho provato Groovy alcuni anni fa (pre Java 7), e l'ho trovato troppo lento. Sono stato in grado di velocizzare le cose rendendo il mio codice meno groovificato, ma era ancora 10 volte più lento. Quindi sono appena tornato in Java. Dovrei provare nuovamente con Java 7 per vedere se ho incontrato gli stessi problemi, ma penso di aver letto che Groovy è ancora 10 volte più lento di Java e non posso permettermi 10 volte più hardware! –

+0

@BobThule: Groovy è diventato molto più veloce oggi e, cosa abbastanza interessante, Java 7 ha giocato un ruolo importante in questo (tramite 'invokedynamic'). –

2

Sospetto che stiate pensando a una aggiunta pianificata a Java 8 che consentirà di aggiungere metodi, con implementazioni predefinite, a un'interfaccia - in modo da poter aggiungere nuovi metodi senza rompere tutto il codice esistente. Questo è utile solo se si controlla il tipo di interfaccia, quindi non sarebbe utile per String, perché String non è un'interfaccia.

+0

Hi Louis, giusto, ma i metodi di estensione di C# consentono di aggiungere metodi a una classe - è solo zucchero sintattico, ma rende piuttosto il codice, e per sviluppi più rapidi poiché il completamento del codice può offrirti i metodi. Credo che gli sviluppatori JDK abbiano prima modellato i metodi di estensione Java al di fuori di C#, ma poi hanno visto che non risolveva i problemi che gli sviluppatori di librerie stavano affrontando, e quindi lo ha trasformato in quello che è adesso-- che è una soluzione davvero eccezionale, ma non particolarmente utile per gli sviluppatori finali che cercano di rendere il loro codice carino. –

+0

Eh. Sono personalmente molto a favore dei limiti che la gente Java ha posto sui metodi di estensione di Java 8 - parlando come designer di librerie, ho sentimenti molto contrastanti sul fatto che gli sviluppatori finali possano aggiungere metodi arbitrari a un tipo. –

+0

Penso che i metodi di estensione di java 8 siano fantastici e non vorrei perdere la loro funzionalità. È una cosa preferenziale, e non proverei a dire che hai torto se ti piace avere molte chiamate a metodi statici nascosti nelle classi di utilità, ma preferisco chiamare i metodi direttamente sui miei oggetti.Penso che sia più pulito, più leggibile e più orientato agli oggetti. E visto che la maggior parte degli altri linguaggi è in grado di mixare/tratti/metodi di estensione, mi piacerebbe essere in grado di fare lo stesso con Java. Che succede a String che non ha un insieme più ricco di metodi per i membri? Soprattutto perché è una classe finale? –

Problemi correlati