Accueil > Forum > > > > Fonctions static, surcharge et généric
Fonctions static, surcharge et généric
jeudi 7 août 2008 à 19:32:05 |
Fonctions static, surcharge et généric

neodelphi
|
Bonjour, je suis en train de me plonger dans le Java afin de faire un site web à l'aide de servlets, mais je butte sur un problème en rapport avec le langage. Voici donc l'énoncé du problème (simplifié pour que ce soit plus clair) :
soit une classe Plante. Je souhaite dériver de cette classe des classes représentant des plantes et les décrivant. Par exemple une classe Rose et une classe Tuya. Prenons ensuite une dernière classe Jardinier, donc le but est de mettre des plantes dans le jardin en fonction de leur couleur. Je souhaiterai faire appel au Jardinier de la façon suivante:
Jardinier.ajouterFleur(Rose.class); ou bien
Jardinier.ajouterFleur(Tuya.class); La classe Jardinier effectue des opérations dépendantes de la couleur des plantes, et doit donc faire appel à la méthode Rose.getColor ou Tuya.getColor. Je souhaite en fait que ces fonctions soient statiques, car elles renvoient une valeur qui n'est pas dépendante d'une instance mais uniquement spécifique à la classe. La déclaration de la fonction getColor doit donc pour moi se situer dans la classe Plante puis être surchargée par les classe héritant (équivalent à une fonction statique virtuelle en C++) mais le compilateur me gronde...
Dernière précision, la fonction ajouterFleur serait de la forme:
public void <F extends Plante> ajouterFleur(Class<F> classeFleur){ ... ... F.getColor() ... ... }
Hélas je ne trouve pas de solutions à ce problème pourtant simple, et je ne veut pas avoir à créer une instance pour appeler une fonction qui me renverra toujours la même valeur (ce que je peux en fait faire avec un singleton, mais bon...).
Tout conseil est bienvenu ! Merci pour votre aide !
neodelphi
|
|
vendredi 8 août 2008 à 09:17:17 |
Re : Fonctions static, surcharge et généric
|
vendredi 8 août 2008 à 13:14:01 |
Re : Fonctions static, surcharge et généric

indiana_jules
|
Salut,
Une solution envisageable serait de créer une classe Abstraite du syle AbstractFleur qui contiendrait ta méthode statique, et pour chacune de tes classes héritant de celle-ci, tu surchargerais cette méthode là. Du coup, en paramétre de ta méthode "ajouterFleur", tu aurais Class<? extends AbstractFleur> ...
A tester (je ne peux pas garantir que cela va fonctionner, je n'ai pas d'envrionnement pour tester rapidement là où je suis à cette instant T :( )
Voili voilà
[#Tout le monde a des idées : la preuve, c'est qu'il y en a de mauvaises] [#Je ne comprends pas tout, mais je parle de tout : c'est ce qui compte]
|
|
vendredi 8 août 2008 à 13:40:55 |
Re : Fonctions static, surcharge et généric

Twinuts
|
Salut, la solution avec reflect soit en restant en accord avec l'origine de la question (perso je trouve la solution de indiana_jules bien plus objet et beaucoup plus propre) : import java.awt.Color; import java.lang.reflect.Method; public class ReflectStatic { public static void main(String[] args) { ReflectStatic rs = new ReflectStatic(); try { rs.ajouterFleur(Rose.class); } catch (Exception e) { e.printStackTrace(); } } public <F extends Plante> void ajouterFleur(Class<F> classeFleur) throws Exception { Method getColor = classeFleur.getMethod("getColor", new Class[] {}); Color c = (Color)getColor.invoke(null, new Object[] {}); System.out.println("getColor : " + c); } private static class Plante { // super caca puis la couleur vaut pour TOUTES les instances de TOUTES les plante.... public static Color getColor() { return Color.RED; } } private static class Rose extends Plante { } } ------------------------------------ "On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
OoWORAoO
|
|
samedi 9 août 2008 à 12:58:13 |
Re : Fonctions static, surcharge et généric

neodelphi
|
Rebonjour !
Merci pour vos réponse, c'est sympa de pouvoir discuter de ce problème. Twinuts, j'avait un peu réfléchi à cette solution qui fonctionnerait sans doute, mais je n'aime pas du tout cette philosophie et je considère ça comme du hack ou de la bidouille, il n'y pas vraiment de vérifications faites par le compilo sur le code du programmeur... de plus l'appel de la fonction est assez lourd en terme de performances.
Indiana_jules, la surcharge de fonctions statique fonctionne sur des instances, mais à moitié sur des statics. Je m'explique:
class A { static void test(){ écrire 'A' } }
class B extends A { static void test(){ écrire 'B' } }
Si on fait B.test() on obtiend 'B' comme attendu. Si on passe la classe au travers des génériques, de cette façon:
public static <E extends A> String test(Class<E> c){ return E.test(); }
en fesant test(B.class) on obtien 'A' et non 'B', comme si la surcharge est ignorée. Je trouve que ça fait un peu "bug" comme résultat mais bon, certains disent que c'est la surchage des static qui ne devrait pas marcher si c'était bien foutu.....
J'ai vu des programmeurs recommandant d'utiliser les singletons pour avoir le comportement normal des surcharges, mais je trouve dommage de ne pas utiliser les statics lorsque cela semble logique étant donné que les instances n'apportent rien.
neodelphi
|
|
samedi 9 août 2008 à 13:55:12 |
Re : Fonctions static, surcharge et généric

indiana_jules
|
Salut si tu utilises une version 1.5 ou plus récente, tu peux peut-être mettre une annotation "override" pour bien préciser à la JVM qu'il s'agt d'une surcharge. Peut-êre que cela marchera mieux.
A++
[#Tout le monde a des idées : la preuve, c'est qu'il y en a de mauvaises] [#Je ne comprends pas tout, mais je parle de tout : c'est ce qui compte]
|
|
samedi 9 août 2008 à 13:57:48 |
Re : Fonctions static, surcharge et généric
|
samedi 9 août 2008 à 14:18:26 |
Re : Fonctions static, surcharge et généric

neodelphi
|
En fait je souhaitai le static chez les classes héritant, et je pensais l'imposer en proposant la méthode en abstrait. Ainsi en donnant un objet Plante le compilateur saurait que quelque soit la classé héritant, il existe la fonction getColor qui peut être appelée sans créer d'instances.
Je justifie l'utilisation du static en expliquant que quelque soit l'instance de Rose, la fonction getColor renvoie toujours la meme valeur. De même pour Tuya, la fonction renvoie toujours la même valeur. C'est du static appliqué à la classe et non à l'ensemble des classes héritant de Plante.
Pour moi une fonction ne doit pas être statique dès que son résultat dépend de l'instance sur laquelle la fonction est appelée.
"de plus l'appel de la fonction est assez lourd en terme de performances." ">> détrompe toi"
Pourtant il ne s'agit plus d'un simple saut, par exemple une instance de Method est crée et des appels d'autres fonctions sont exécutées. L'appel est donc au moins 3 fois plus lourd je pense.
neodelphi
|
|
samedi 9 août 2008 à 15:56:31 |
Re : Fonctions static, surcharge et généric
|
samedi 9 août 2008 à 16:34:38 |
Re : Fonctions static, surcharge et généric

indiana_jules
|
Salut, Effectivement Twinuts, je trouve que l'utilisation d'un static dans ce cadre là est superflu, d'autant plus sheoragath a raison, une rose peut avoir plusieurs couleurs. Du coup, l'utilisation d'une classe abstraite, d'une interface, ou des deux est fortement conseillé. Après, je me posais la question de savoir si on pouvait faire la même chose sur une méthode statique Je sais que j'ai vu des API (exemple JXTA) qui te "forçait" à déclarer une méthode statique à la classe, en te levant une exception lors de l'insertion / utilisation (il devait faire de l'introspection sans doute pour la détecter). Néanmoins, le static, il ne faut l'utiliser, soit pour des constantes, soit pour des méthodes "utilitaires", soit pour le singleton. Pour tout le reste, je trouve que ca ne peut apporter que du code spaghetti et assez hideux. Du coup, une bonne approche Objet est conseillé. Voili voilà [#Tout le monde a des idées : la preuve, c'est qu'il y en a de mauvaises] [#Je ne comprends pas tout, mais je parle de tout : c'est ce qui compte]
|
|
Cette discussion est classée dans : fonction, classe, getcolor, jardinier, ajouterfleur
Répondre à ce message
Sujets en rapport avec ce message
déclaration d'une fonction dans un fichier java [ par moooonaaaa ]
Salem, j'ai besoin de faire une fonction dans un fichier .java mais cette fonction ne fait pas partie de la classe. cette fonction me permet de retour
Executer fonction autre classe [ par aforpien ]
Bonsoir, J'essai de faire en sorte de faire communiquer deux classes. En fait, je remplit un jTable sur une form, et j'ai créer un bouton pour en exp
Appel d'une classe avec contrainte dans une fonction [ par fraisa1985 ]
Salut a tous,mon probleme est la suivante:J'ai une classe qui contient deux champs texte(JTextField) et une bouton oklorsque je clique sur le bouton o
Java et les threads [ par Taz1984 ]
Bonjour, Je suis en train de coder une classe qui permet de prendre en entrée un fichier et stocker les informations dans une base données. Cette cl
appel de fonction dans une classe java [ par wajdisint ]
salut à tous j'ai une classe qui contient une des fonctions pour segmenter un texte HTML mais le probleme c'est l'appel des fonction j'ai besoin de vo
KeyListener et Runnable dans la même classe [ par guitoucode ]
Bonjour, voici mon problème: J'ai crée une classe qui implémente( c'est encore un peu flou pour moi) Runnable(pour la création de Thread) et KeyListe
Fonction d'évaluation [ par saadabdi ]
Bonjour, Je viens de terminer la partie graphique d'un jeu d'échec avec les règles et tout , donc 2 personnes peuvent jouer avec mon jeu maintenant.
Problème avec JComboBox [ par ramine1980 ]
bonjour, j'utilise Swing, j'ai un comboBox de type "JComboBox", je veux que lorsque l'utilisateur passe la souri sur ce Combo faire un traitement, j'
Notion ou terminologies de certains mots [ par philouxy ]
Bonsoir à tous chers Programmeurs, Le titre peut paraître un peu bizarre, mais je suis entrain de faire de la révision, (lecture de cours), et je sè
exécution d'une fonction plusieurs fois automatiquement [ par youness601 ]
Bonjour à tous, mon but est d'exécuter une fonction chaque 30 secondes pour récupérer des infos d'une base de données. Je sais qu'il existe la fonct
Livres en rapport
|
Derniers Blogs
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
FORMTIONFORMTION par 25721088
Cliquez pour lire la suite par 25721088
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|