2013-04-29 14 views
5

Se uno sviluppatore estende una classe Java che fa parte del JDK e aggiunge nuovi metodi ad esso, c'è sempre il rischio che una versione futura di java possa introdurre metodi con lo stesso nome/firma con conseguente comportamento indesiderato se il programma è eseguito con queste versioni future. Poiché non è disponibile l'annotazione "Non-Overrides" (vedere http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7152222) che rileverà tali possibili problemi quando qualcuno compila il codice con una versione più recente del JDK, lo sviluppatore deve eseguire questi controlli in un modo diverso. Quale approccio usi?Quale approccio utilizzare nei propri programmi per sfruttare gli aggiornamenti per le versioni future di Java?

+0

Quale classe java stai cercando di estendere? Forse c'è qualche consiglio su questo se è possibile specificare più il caso d'uso. – vikingsteve

+0

Il problema si è verificato durante la transizione da JDK6 a JDK7 in cui il metodo getType() è stato introdotto in JDK7. Abbiamo avuto alcune classi nel nostro codice che estende java.awt.Window che aveva già un metodo getType(). – mschenk74

risposta

13

È un antipattern estendere le classi di JDK, ad eccezione di quelle che sono specificamente progettate per essere utilizzate estendendole. È necessario utilizzare lo schema Decorator per aggiungere funzionalità alle classi JDK. JDK non è un caso particolare, vale anche per le librerie di terze parti.

+0

+1 - Non esiste un modo a prova di futuro per estendere le classi che non sono progettate per essere estese. Miglior approccio? Basta non farlo affatto! –

+0

La classe JDK concreta era java.awt.Window, il metodo concreto era getType(). In generale sono d'accordo con te, ma in questo caso speciale penso che estendere la classe Window sia stata l'unica possibilità. – mschenk74

+0

@ mschenk74 Dal momento che 'Window' è la base della gerarchia della classe del contenitore dell'interfaccia grafica completa, non vedo come si otterrebbe nulla anche se la si è sottoclasse: tutto il resto del JDK continuerà ad estendersi da' Window 'e non dalla sottoclasse personalizzata. –

0

L'ereditarietà è una tecnica potente ma a causa della mancanza di conoscenza può essere peggio. Quindi in questo caso devi usare la composizione invece dell'ereditarietà. Creare una classe che contenga l'oggetto della classe java che si desidera estendere e quindi estendere la classe alla classe appena creata invece della classe orignal.