Ecco il mio problema in realtà sto affrontando ora. Ho una classe, diciamo Foo
e questa classe definisce un metodo chiamato getBar
che restituisce un'istanza Bar
. La classe Bar
è definita all'interno di Foo
ed è dichiarata public static final
. Quello che voglio fare è definire una classe MyFoo
che si estende Foo
ma voglio anche estendere Bar
con MyBar
aggiungendo le mie funzionalità (metodi, proprietà, ecc.). Voglio anche getBar
restituire MyBar
.Come estendere una classe finale in Java
Il problema è Bar
è definitivo. Ecco un esempio di quello che voglio fare:
public class Foo {
Bar bar = new Bar();
public Bar getBar(){
return bar;
}
....
public static final class Bar {
}
}
Quello che voglio fare è:
public class MyFoo extends Foo {
public MyBar getBar(){ // here I want to return an instance of MyBar
}
public static final class MyBar extends Bar { // That's impossible since Bar is final
}
}
Come posso raggiungere questo obiettivo?
[EDIT] Sto aggiungendo ulteriori dettagli alla mia domanda. Attualmente sto sviluppando un plugin per Jenkins e dopo la ricerca, mi rendo conto che esiste un plug-in che offre le funzionalità di base che voglio fare, Foo
e Bar
. Voglio personalizzare Foo
e Bar
, in modo che possa soddisfare le mie esigenze. Foo è la classe principale del plugin e estende una classe chiamata Builder. Foo definisce un metodo chiamato perform
che contiene tutte le operazioni per eseguire una compilazione. Bar
contiene operazioni per scopi di configurazione e Foo ha bisogno di Bar per ottenere quelle informazioni.
Quindi quello che voglio fare è estendere Foo con MyFoo
e aggiungere alcune configurazioni con MyBar
. E come vedete, MyFoo
sarà necessario ottenere quei configuations chiamando getBar();
La seconda cosa è che non ho il controllo della instanciation di MyFoo
e MyBar
quello che mi blocchi, è che non riesco a estendere Bar. Come posso ottenerlo?
Dato che il modificatore di 'final' impedisce di sottoclasse' Bar', mi consiglia di "avvolgerlo". – mre
Se 'Bar' è una' classe finale', di solito è per una buona ragione, ad es. forse perché alcuni invarianti di 'Foo' lo richiedono. Quindi non lo farò, o almeno dovresti capire esattamente tutto il codice sorgente pertinente, e magari riscriverlo. –
Chiedi allo sviluppatore di 'Bar' di renderlo non-finale o usa la delega come suggerisce mre. –