Comment étendre une classe finale en Java
Voici mon problème en fait, je suis maintenant face.
J'ai une classe, disons Foo
et cette classe définit une méthode appelée getBar
qui renvoie un Bar
instance. La classe Bar
est définie à l'intérieur d' Foo
et et est déclaré public static final
. Ce que je veux faire est de définir une classe MyFoo
qui s'étend Foo
mais je tiens également à exprimer Bar
avec MyBar
en ajoutant mes propres fonctionnalités (méthodes, propriétés,etc).
Je veux aussi getBar
de retour MyBar
.
Le problème est Bar
est définitive. Voici une illustration de ce que je veux faire :
public class Foo {
Bar bar = new Bar();
public Bar getBar(){
return bar;
}
....
public static final class Bar {
}
}
Ce que je veux faire est :
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
}
}
Comment puis-je y parvenir?
[EDIT] je suis ajouter plus de détails à ma question.
Je suis en train de développer un plugin pour Jenkins et après recherche, j'ai réalisé qu'il existe un plugin qui propose les fonctionnalités de base que je veux faire, Foo
et Bar
. Je veux la coutume Foo
et Bar
, de sorte qu'il peut s'adapter à mes besoins.
Toto est la classe principale du plugin et s'étend une classe appelée Constructeur. Foo définit une méthode appelée perform
qui contient toutes les opérations de l'exécution d'une construction.
Bar
contient des opérations pour les configurations les fins et les Foo besoins de la Barre pour obtenir ces informations.
Donc ce que je veux faire est d'étendre Foo avec MyFoo
et ajouter certaines configurations avec MyBar
. Et comme vous le voyez, MyFoo
aurez besoin pour obtenir ces configuations en appelant getBar();
La deuxième chose est que je n'ai aucun contrôle de l'instanciation de MyFoo
et MyBar
Ce qui me bloque, c'est que je ne peux pas étendre Bar. Comment puis-je y parvenir?
source d'informationauteur Dimitri
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas, dans le fond. On dirait que le développeur qui a conçu
Bar
prévu pour elle de ne pas être étendus, de sorte que vous ne pouvez pas prolonger. Vous aurez besoin de regarder pour un design différent - peut-être celui qui ne pas utiliser l'héritage tellement... en supposant que vous ne pouvez pas modifier le code existant, bien sûr.(Il est difficile de donner plus de conseils concrets sans en savoir plus sur le but réel ici - la conception de l'ensemble du système.)
Vous ne pouvez pas étendre une classe qui est déclarée
final
. Cependant, vous pouvez créer une classe intermédiaire, appeléWrapper
. Ce Wrapper va contenir une instance de la classe d'origine et de fournir d'autres méthodes pour modifier l'état de l'objet en fonction de ce que vous voulez faire.Bien sûr, cela ne donnera pas accès à l'privée & des champs protégés de la
final
classe, mais vous pouvez utiliser ses getters et setters méthodes, combinées avec les nouvelles méthodes & les champs que vous avez déclaré dans leWrapper
classe pour obtenir le résultat que vous souhaitez, ou quelque chose de relativement proche.Une autre solution est de ne pas déclarer
final
une classe, si il n'y a aucune raison valable de le faire.Vous ne pouvez pas prolonger un
final
classe - qui est le but de lafinal
mot-clé.Cependant, il existe (au moins) deux solutions de rechange:
Vous ne pouvez pas étendre finale de classes, qui est le point de déclarer des classes de finale. Vous pouvez définir une interface à la fois la dernière classe hérite de et une classe wrapper que les délégués des appels à la enveloppé classe finale. La question est alors pourquoi faire la classe finale à la première place.
Probablement ce que vous voulez, c'est un Proxy. Il est facile à mettre en œuvre. C'est un excellent article: http://java.dzone.com/articles/power-proxies-java
Par exemple on ne peut pas ajouter un StringBuffer dans le TreeSet Collection, parce que
TreeSet n'est pas l'enfant de l'Interface Comparable:
Mais nous pouvons utiliser un wrapper pour mettre en œuvre le Comparable:
Si elle implémente plusieurs interfaces, Décorateur pourrait résoudre le Problème.