Logo du forum
 

Forum TTH-News

| Inscription | | Recherche | | FAQ | | Accueil | | Liste des membres |
| Calendrier |
 
Vous n'êtes pas identifié! [Connexion] ou [Inscription] Forum » Programmation » [Java] » Problème avec Vector
Login Mot de passe

2 visiteurs sur ce topic (0 membre(s), 2 invité(s) )


Aller à la page n°  
  Mot  Pseudo  
Page : 1 2
Auteur
Sujet : Problème avec Vector
Aquillon
Vétéran
Membre # 6518

 Avatar du membre
Lieu : Genève

Messages :
3749 (0.7 par jour)


Score :

Message du 04-02-2007 @ 17:06   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   


Salut,

j'ai une classe GroupeEtudiantsVector dans laquelle j'ai donc mon vector v qui contient des Etudiants (nom et prenom). J'ai une fonction public boolean contains(Etudiant e) à taper mais c'te connasse ne veut pas fonctionner :o (et y'a d'autre fonction aussi sur lesquelles je galère mais chaque chose en son temps :o)
bref je ne vois pas ce qui cloche dans mon truc :

Code :

   public boolean contains(Etudiant e) {
         if(v.contains(e))
            return true;
         else
            return false;
   }



J'ai bien essayé de parcourir mon vecteur mais je ne vois pas la commande qu'il faut tapper pour tester l'égalité de par exemple, le nom de l'étudiant à la case 2 du vecteur.
----------
- Haut de page -
Zéphyr
Master
Membre # 11215

 Avatar du membre
Lieu : Caen

Messages :
655 (0.13 par jour)


Score :

Message du 04-02-2007 @ 17:49   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Tu appelles ta méthode contains, dans ta méthode contain, donc ça peut pas marcher.
Y'a quoi dans ta classe étudiant ?
Va falloir que t'utilises les méthodes de Vector, indexOf me semble approprier là, t'auras donc un truc du genre
if(v.indexof(e)==-1)
return false;
else
return true;

Toutes les méthodes de Vector sot là : http://java.sun.com/j2se/1.4.2/docs/api/java/util/Vector.html

[message édité le 04-02-2007 @ 17:50 Par Zéphyr]

----------
Les bretons sont des gens comme les autres et n'habitent pas très loin de la France. Les bretons sont nos amis, et nous devons les respecter comme des êtres humains.
- Haut de page -
Zéphyr
Master
Membre # 11215

 Avatar du membre
Lieu : Caen

Messages :
655 (0.13 par jour)


Score :

Message du 04-02-2007 @ 18:11   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

public boolean contains(Etudiant e) {
Etudiant test = new Etudiant ()
while(!this.v.isEmpty()){
test=(Etudiant)v.elementAt(i);
if( ( test.nom.equals(e.nom) ) && ( test.prenom.equals(e.prenom) ) //methode equals de String
return true;
i++
}
return false;
}

[message édité le 04-02-2007 @ 18:12 Par Zéphyr]

----------
Les bretons sont des gens comme les autres et n'habitent pas très loin de la France. Les bretons sont nos amis, et nous devons les respecter comme des êtres humains.
- Haut de page -
icy
Administrateur
Membre # 871

 Avatar du membre
Lieu : Bxl

Messages :
23190 (3.79 par jour)


Score :

Message du 05-02-2007 @ 9:25   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

STOP
ce n'est pas du tout comme ca qu'il faut faire ... c'est bc plus simple et plus oo :p
tu DOIS implementer('fin overwriter) une methode equals dans ta class Etudiant.
Il faut aussi implementer une methode hashcode.

pour le hashcode, utilise la class HashCodeBuilder, qui se trouve dans apache.commons.lang. Si tu peux du moins :p Y'a un exemple dans la javadoc ici Sinon tu fais simplement comme ca :
Code :


public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}



Ensuite tu dois faire une methode equals, un truc du genre, en utilisant, par exemple, commons.lang.ObjectUtils :

Code :


   public boolean equals(Object o){
      if (o instanceof Etudiant){
         Etudiant e = (Etudiant) o;
         return ObjectUtils.equals(e.nom,this.nom) && ObjectUtils.equals(e.prenom,this.prenom);
      }
      return false;
   }



Bon, ca c'est la facon la plus simple, rapide et sur de faire ces 2 methodes (grace a commons.lang)

Ensuite il te suffit d'appeler la methode contains sur ta collection dans ton code, pas besoin de l'overider dans ta class vector. Cette methode a tout simplement besoin d'un hashcode et d'un equals sur les object qu'elle contient pour fonctionner ;)

ps: si tu ne peux pas utiliser commons.lang (ce qui serrait débile |-[ ) va falloir faire le equals et hashcode manuellement.
Si tu peux utiliser commons.lang, jette un oeil aux lib collectionUtils et BeanUtils ;) (et plus généralement ce qu'il y'a dans jakarta ;)


[message édité le 05-02-2007 @ 10:04 Par icy]
----------
"May He touch you with His Noodly Appendage"
- Haut de page -
Aquillon
Vétéran
Membre # 6518

 Avatar du membre
Lieu : Genève

Messages :
3749 (0.7 par jour)


Score :

Message du 05-02-2007 @ 19:57   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

hummm ok :D bon je débute hein, c'est pas le début début mais presque ;) merci quand même :)

Nous avons finalement réussi à la faire c'te fonction

Code :

   
public boolean contains(Etudiant e){
      Etudiant test = new Etudiant ();
      for(i=0;i<v.size();i++){
         test=(Etudiant)v.elementAt(i);
         if((test.getNom().equals(e.getNom()))&&(test.getPrenom().equals(e.getPrenom())))
            return true;
      }
      return false;
   }



C'est peut être pas ce qui se fait de mieux mais elle fonctionne :)

Je vais expliquer un peu plus mon problème, j'ai mon interface GroupeEtudiants :

Code :


public interface GroupeEtudiants {

   //ajouter un étudiant existant dans le groupe
   public void addEtudiant(Etudiant e);
   
   //créer et ajouter un étudiant dans le groupe
   public void addEtudiant(String nom, String prenom);
   
   //tester l'égalité entre 2 groupes(même étudiants dans les 2 groupes)
   public boolean equals(GroupeEtudiants ge);
   
   //le groupe contient-il l'étudiant e ?
   public boolean contains(Etudiant e);
   
   //permer de cloner un groupe
   public Object clone();
   
   //convertit un groupe en String
   public String toString();
}



et 2 classes que je dois faire qui implémente cette interface, GroupeEtudiantsVector et GroupeEtudiantHashtable (que je n'ai pas encore fait mais une fois l'autre terminé je pense que celle là se fera vite fait... j'espere en tout cas ^^)
Jusque là j'ai fais les 2 fonctions addEtudiants, la contains, la clone et la toString. J'ai un petit doute pour la clone mais elle à l'air de fonctionner donc... mon problème réside dans le fait que lorsque je clone mon vecteur
Code :


public Object clone(){
   GroupeEtudiantsVector gev = new GroupeEtudiantsVector();
   gev.v = v;
   return (gev);
}



et que j'affiche pour voir dans le programme principale le résultat, j'ai bien 2 truc identiques mais avec la mise en forme que j'ai indiqué dans ma fonction toString

Code :


public String toString(){
   String list = new String();
   Etudiant test = new Etudiant ();
   for(i=0;i<v.size();i++){
      test=(Etudiant)v.elementAt(i);
      list = list.concat(test.getNom());
      list = list.concat(" ");
      list = list.concat(test.getPrenom());
      list = list.concat("\n");
   }
   return(list);
}



exemple en image :


(pratique cet outil de capture sur Vista :))

le derniere ligne c'est quand je fais le System.out.println dans le programme principal et la ligne au dessus quand je le fais dans la fonction addEtudiant. bref je capte pas pourquoi il me fait la mise en forme. Ensuite (puis maintenant que je suis parti dans le truc bien long) le gros problème (parce que finalement la mise en forme j'm'en fou un peu) c'est ma fonction equals où je dois comparer 2 groupes.
pour test je clone mon groupe puis je fais appel à ma fonction equals :

Code :

   
public boolean equals(GroupeEtudiants ge) {
      if(v.equals(ge)==true)
         return true;
      else
         return false;
   }



Alors évidemment elle ne marche pas, mais j'me disais que c'était peut être à cause de la mise en forme, parce que dans le prog principal il est du genre "Robert Maurice" et dans la classe GroupeEtudiantsVector, le groupe de comparaison est de la forme [Nom : Robert Prenom : Maurice]. Pensez-vous que cela soit la cause de mon problème ou c'est juste que ma fonctione equals c'est zéro ?



[message édité le 05-02-2007 @ 19:59 Par Aquillon]

Pièces jointes
Capturer1.JPG [Voir] [Lien direct vers ce fichier] (Taille : 27.19 Ko - Téléchargements 344)
Capturer.JPG [Voir] [Lien direct vers ce fichier] (Taille : 30.22 Ko - Téléchargements 353)

----------
- Haut de page -
icy
Administrateur
Membre # 871

 Avatar du membre
Lieu : Bxl

Messages :
23190 (3.79 par jour)


Score :

Message du 06-02-2007 @ 8:42   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

oh la la que de tps perdu a vouloir réimplementer une collection... faut que tu revois le principe de l'heritage en OO ;) Franchement tu fais tout a l'envers :sic:

- Il faut vraiment que tu implementes le equals dans Etudiant... ensuite pour verifier si 2 etudiants sont identique tu fait etudiant1.equals(etudiant2) et il te retourne true ou false. Des que tu fais des operations sur une collection ou que tu utilises des hashmap, il faut que hashcode et equals soient implementé dans les object. Sinon ca donne des trucs etrange et tu n'es pas certain du resultat. Contains d'une collection utilise notamment ca.
Allez je suis gentil, voila ta class etudiant :p :
Code :


import java.io.Serializable;

import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.builder.HashCodeBuilder;

public class Etudiant implements Serializable {

   private static final long serialVersionUID = -5189907963718586870L;

   private String nom;

   private String prenom;

   public Etudiant(String nom, String prenom) {
      this.nom=nom;
      this.prenom=prenom;
   }

   public String getNom() {
      return nom;
   }

   public void setNom(String nom) {
      this.nom = nom;
   }

   public String getPrenom() {
      return prenom;
   }

   public void setPrenom(String prenom) {
      this.prenom = prenom;
   }

   public boolean equals(Object o) {
      if (o instanceof Etudiant) {
         Etudiant e = (Etudiant) o;
         return ObjectUtils.equals(e.nom, this.nom)
               && ObjectUtils.equals(e.prenom, this.prenom);
      }
      return false;
   }

   public int hashCode() {
      return HashCodeBuilder.reflectionHashCode(this);
   }

   @Override
   public String toString() {
      return nom + " " + prenom;
   }
}



le toString est appelé par défaut si tu fait system.out.println(groupeEtudiant) , c'est pour ca que c'est formaté.
ta méthode toString de ta collection devrait appeler le toString de chaque element qu'elle contient, donc il faudrait que tu implemente un toString dans Etudiant.

Tu fait du java 5? pq ne pas utilisé les collection typée(generics)? C'est bc plus pratique, et alors fini ta propre implementation d'une collection, c'est a la declaration que tu dis que ta collection va contenir des etidiant.
Collection c = new Vector();

en declarant ta collection comme ca, tu ne peux mettre que des etudiants dedans. si tu mets autre chose ca renvois une erreur lors de la compilation(et pas de l'exec!), et ca devient bc plus facile. Regarde les propositions de eclipse, il ne te propose plus add(Object o) mais add(Etudiant o), car il sait que ta collection ne peut contenir que des Etudiant.

Il te suffit allors de faire des
c.add(new Etudiant("pierre","paul")) ou c.add(etudiantPaul) ou c.add(autreGroupedEtudiant)

et des if (c.contains(etudiantPaul)){ ...

ps: pfff, la balaise code qui ajoute des : ...

[message édité le 06-02-2007 @ 8:45 Par icy]
----------
"May He touch you with His Noodly Appendage"
- Haut de page -
bambino
Sage
Membre # 8669

 Avatar du membre
Lieu : lille

Messages :
1257 (0.24 par jour)




Message du 06-02-2007 @ 8:48   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Quand tu fais un system.out.println sur un objet, ca appelle automatiquement la méthode toString() de la classe de cet objet. donc si t'as

Code :

Etudiant e=new Etudiant("Robert","maurice");
System.out.println(e);



c'est normal d'avoir ton affichage de la dernière ligne.

Pour la méthode equals de GroupeEtudiant, elle ne fonctionne pas, car tu as fait la meme erreur qu'au debut: equals appelle equals! (elle est recursive, mais sans condition d'arret).

De plus tu devrais savoir si on te demande une méthode equals qui peut comparer GroupeEtudiant quel que soit leur implémentation (hashtable ou vector), ce qui me parait bizarre, ou si tu dois en écrire une pour GroupeEtudiantVector et une pour GroupEtudiantHashTable.

edit: :tgv: par icy


[message édité le 06-02-2007 @ 8:52 Par bambino]
----------
Sachant que Woody Allen a déclaré: "Quand j'écoute Wagner, j'ai envie d'envahir la pologne", quelle musique écoute Georges Bush jr?
- Haut de page -
Aquillon
Vétéran
Membre # 6518

 Avatar du membre
Lieu : Genève

Messages :
3749 (0.7 par jour)


Score :

Message du 09-02-2007 @ 16:48   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Ok merci à vous. J'ai finalement réussi à faire mon truc :)
----------
- Haut de page -
chip
Master
Membre # 9417

 


Messages :
375 (0.07 par jour)


Voter pour ce membre

Message du 17-06-2007 @ 16:17   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Bonjour,

Citation

Tu appelles ta méthode contains, dans ta méthode contain, donc ça peut pas marcher.



heu... il appellerait pas contains sur un v par hasard ? Faut revoir les cours de prog OO !
bref, comme on te l'a dit un peu plus bas, il faut que tu implémente la méthode equals dans la classe des objets que tu stockes dans ton vecteur pour que contains sur v fonctionne. Sinon, c'est la methode de la classe Object qui sera utilisée, qui elle utilise une comparaison sur un clé de hashage. Inutile donc à mon avis de s'embeter à calculer un hash avec HashCodeBuilder si tu implémente ta propre méthode 'equals'.

Citation

Pour la méthode equals de GroupeEtudiant, elle ne fonctionne pas, car tu as fait la meme erreur qu'au debut: equals appelle equals! (elle est recursive, mais sans condition d'arret).



:cop: alala. Bon, une fonction récursive est une fonction qui fait appel à elle-même. Exemple le plus connu factorielle factorielle(n)=n x factorielle(n-1).
Pas de ça ici puisque ta fonction equals de GroupeEtudiant appelle la fonction equals de ... Vector, non ? Donc c'est pas du récursif. L'erreur est la même que précédemment, tu n'as pas défini le fonctionnement particulier de equals de la classe Vector avec un parametre de type GroupeEtudiant, donc ca répond false à chaque fois... Ceci dit, en toute logique d'un point de vue OO, c'est une réponse correcte, aucune raison qu'un Vector soit de quelques manières que ce soit égal à un GroupeEtudiant.

Il faudrait appeler equals sur l'objet v avec comme paramètre le 'v' de ton 'ge'.

chip
----------
TravelMate 800 LCi
- Haut de page -
icy
Administrateur
Membre # 871

 Avatar du membre
Lieu : Bxl

Messages :
23190 (3.79 par jour)


Score :

Message du 17-06-2007 @ 16:39   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

chip a écrit

Inutile donc à mon avis de s'embeter à calculer un hash avec HashCodeBuilder si tu implémente ta propre méthode 'equals'.



pour ton info ;)
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
cfr l'api;)

----------
"May He touch you with His Noodly Appendage"
- Haut de page -
chip
Master
Membre # 9417

 


Messages :
375 (0.07 par jour)


Voter pour ce membre

Message du 18-06-2007 @ 16:43   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

icy a écrit



pour ton info ;)
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
cfr l'api;)



mea culpa. surement pour que les structures fonctionnent correctement.
et le seul moyen de faire ça proprement c'est l'artillerie apache ?

----------
TravelMate 800 LCi
- Haut de page -
icy
Administrateur
Membre # 871

 Avatar du membre
Lieu : Bxl

Messages :
23190 (3.79 par jour)


Score :

Message du 18-06-2007 @ 17:10   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

artillerie ??? :???:
commons lang c'est 200k, c'est super mega pratique, tres tres utilisé et vite placé a meme le repertoire lib de n'importe quel appserver ou web containre ;)

Perso je pourrais plus me passer de CollectionUtils, DateUtils, Hashcodebuilder, LocaleUtils ou StringUtils... faut vraiment que tu y jettes un oeil :p
Pourquoi réinventer la roue a chaque fois? Y'a tout ce qu'il faut dans jakarta :p

ps: Et vive Spring :D
----------
"May He touch you with His Noodly Appendage"
- Haut de page -
chip
Master
Membre # 9417

 


Messages :
375 (0.07 par jour)


Voter pour ce membre

Message du 18-06-2007 @ 17:15   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

icy a écrit

artillerie ??? :???:
commons lang c'est 200k, c'est super mega pratique, tres tres utilisé et vite placé a meme le repertoire lib de n'importe quel appserver ou web containre ;)

Perso je pourrais plus me passer de CollectionUtils, DateUtils, Hashcodebuilder, LocaleUtils ou StringUtils... faut vraiment que tu y jettes un oeil :p
Pourquoi réinventer la roue a chaque fois? Y'a tout ce qu'il faut dans jakarta :p

ps: Et vive Spring :D



lol.

c'est surement en voyant ca :

"public boolean equals(Object o) {
if (o instanceof Etudiant) {
Etudiant e = (Etudiant) o;
return ObjectUtils.equals(e.nom, this.nom)
&& ObjectUtils.equals(e.prenom, this.prenom);
}
return false;
}
"

que j'ai pensé "artillerie"...

... mais je jetterai un oeil, promis. :)


[message édité le 18-06-2007 @ 17:16 Par chip]
----------
TravelMate 800 LCi
- Haut de page -
icy
Administrateur
Membre # 871

 Avatar du membre
Lieu : Bxl

Messages :
23190 (3.79 par jour)


Score :

Message du 18-06-2007 @ 17:22   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

chip a écrit



lol.

c'est surement en voyant ca :

"public boolean equals(Object o) {
if (o instanceof Etudiant) {
Etudiant e = (Etudiant) o;
return ObjectUtils.equals(e.nom, this.nom)
&& ObjectUtils.equals(e.prenom, this.prenom);
}
return false;
}
"

que j'ai pensé "artillerie"...

... mais je jetterai un oeil, promis. :)


qu'est-ce qui te choque la dedans ? :p
ObjectUtils.equals(e.nom, this.nom) ne fait rien d'autre que return (e.nom!=null && this.nom!=null && e.nom.equals(his.nom))
plus court non? :p

----------
"May He touch you with His Noodly Appendage"
- Haut de page -
chip
Master
Membre # 9417

 


Messages :
375 (0.07 par jour)


Voter pour ce membre

Message du 18-06-2007 @ 17:23   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

icy a écrit


qu'est-ce qui te choque la dedans ? :p
ObjectUtils.equals(e.nom, this.nom) ne fait rien d'autre que return (e.nom!=null && this.nom!=null && e.nom.equals(his.nom))
plus court non? :p



c'est quoi un etudiant avec un nom null ?

... ça fait un appel de f° de moins.

[message édité le 18-06-2007 @ 17:25 Par chip]
----------
TravelMate 800 LCi
- Haut de page -
icy
Administrateur
Membre # 871

 Avatar du membre
Lieu : Bxl

Messages :
23190 (3.79 par jour)


Score :

Message du 18-06-2007 @ 17:27   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

un etudiant mal instancié ou un nom mal "setté" dans un formulaire par exemple, ou bien le nom a été injecté par un bean quelconque dont on a pas le controle.
Imagine une table gérer par une autre appli qui fait mal son boulot etc...
Une méthode equals dont tester l'égalité de ttes les propriétés voulue qui la compose... et le test de nullité doit tj etre la... ;)

[message édité le 18-06-2007 @ 17:28 Par icy]
----------
"May He touch you with His Noodly Appendage"
- Haut de page -
chip
Master
Membre # 9417

 


Messages :
375 (0.07 par jour)


Voter pour ce membre

Message du 18-06-2007 @ 17:29   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

icy a écrit

un etudiant mal instancié ou un nom mal "setté" dans un formulaire par exemple, ou bien le nom a été injecté par un bean quelconque dont on a pas le controle.
Une méthode equals dont tester l'égalité de ttes les propriétés voulue qui la compose...



bien la peine d'ecrire des trucs plus court si on passe son temps à tester tous les cas problematiques au lieu de faire en sorte qu'ils n'arrivent pas...
----------
TravelMate 800 LCi
- Haut de page -
icy
Administrateur
Membre # 871

 Avatar du membre
Lieu : Bxl

Messages :
23190 (3.79 par jour)


Score :

Message du 18-06-2007 @ 17:34   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Y faut justement les tester pour qu'il n'arrive pas... tu bosses sur quel style d'appli toi ? Les petites web app toute gentiles comme on fait a l'ecole j'en ai jamais vu moi :p

Et puis vouloir supprimer un appel a une methode super optimisé dans objectutils pour un equals, qu'est-ce que ca fait gagner comme temps dans une web app acutel qui lance 10 thread et au moins 1000 methodes sur la stack pour affichier une page, le tout sans rammer sur un petit p3.
le temps ou java rammait, c'est fini hein ;)

Faire un bon equals et un bon hashcode dans un objet serializable, ca prends 5 minutes, et ca évite des dizaines de pbm a la con plus tard (set, sorted list, persistence...)



[message édité le 18-06-2007 @ 17:35 Par icy]
----------
"May He touch you with His Noodly Appendage"
- Haut de page -
chip
Master
Membre # 9417

 


Messages :
375 (0.07 par jour)


Voter pour ce membre

Message du 18-06-2007 @ 17:40   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

icy a écrit

Y faut justement les tester pour qu'il n'arrive pas... tu bosses sur quel style d'appli toi ? Les petites web app toute gentiles comme on fait a l'ecole j'en ai jamais vu moi :p

Et puis vouloir supprimer un appel a une methode super optimisé dans objectutils pour un equals, qu'est-ce que ca fait gagner comme temps dans une web app acutel qui lance 10 thread et au moins 1000 methodes sur la stack pour affichier une page, le tout sans rammer sur un petit p3.
le temps ou java rammait, c'est fini hein ;)

Faire un bon equals et un bon hashcode dans un objet serializable, ca prends 5 minutes, et ca évite des dizaines de pbm a la con plus tard (set, sorted list, persistence...)



c'est bien ce que je dis, vaut mieux passer 5 mn à coder un truc proprement.
c'est sur que si tu ne fais que des web apps, faire une centaine d'appels de f° ca va pas se voir, mais bon, y'a pas que les web apps dans la vie.

[quote]Y faut justement les tester pour qu'il n'arrive pas... [\quote]
justement, au moment ou tu fais ton etudiant.equals(l'autre) c'est un peu tard pour se rendre compte que ton étudiant a pas de nom, non ?

[message édité le 18-06-2007 @ 17:42 Par chip]
----------
TravelMate 800 LCi
- Haut de page -
icy
Administrateur
Membre # 871

 Avatar du membre
Lieu : Bxl

Messages :
23190 (3.79 par jour)


Score :

Message du 18-06-2007 @ 18:07   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

chip a écrit


[quote]Y faut justement les tester pour qu'il n'arrive pas... [\quote]
justement, au moment ou tu fais ton etudiant.equals(l'autre) c'est un peu tard pour se rendre compte que ton étudiant a pas de nom, non ?



sauf qu'equals c'est appelé par tout et n'importe quoi, sans que t'ai le controle dessus...et donc sans qu'on s'en rende compte. Un point de design paterns, c'est de bien coder la methode equals...
equals d'un objet est appelé lors que tu fait un set.add, un collection.equals, un persist dans une db (sur la pk, qui peut etre composé et donc un obj), et certainement un peu partout des que tu utilises les ejb(dans le jndi, en rmi...)

Si l'equals n'etait pas un mecanisme/methode important, ce ne serait pas un des objectifs de la certif java ;)

Les user ca met tout et n'importe quoi dans un champs. Ca a des demandes débiles niveau programation, mais qui ont un sens fonctionellement.
Y suffit que tu travaille avec +ieurs applis qui attaque la meme table sans pouvoir y mettre des "not null", et tu te retrouves avec des valeurs importante a null et a traité en soft.

Puis je connais qq'un qui n'a pas de nom:p Un belge d'orignie Zaïroise qui n'a jamais eu de nom de famille et ou le champs sur sa carte d'identité est vide ;)

'fin bon, je veux pas imposer mon point de vue non plus ;)

ps: tu bosses sur quoi comme appli? ou dans quel style de boite? :p
----------
"May He touch you with His Noodly Appendage"
- Haut de page -
chip
Master
Membre # 9417

 


Messages :
375 (0.07 par jour)


Voter pour ce membre

Message du 18-06-2007 @ 18:27   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

peu importe a quel moment et par qui equals est appelée, ton objet ne devrait pas etre créé avec un nom null
pour ton zairois, tu peux mettre une chaine vide...


----------
TravelMate 800 LCi
- Haut de page -
icy
Administrateur
Membre # 871

 Avatar du membre
Lieu : Bxl

Messages :
23190 (3.79 par jour)


Score :

Message du 18-06-2007 @ 18:52   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

chip a écrit

peu importe a quel moment et par qui equals est appelée, ton objet ne devrait pas etre créé avec un nom null
pour ton zairois, tu peux mettre une chaine vide...



ah bon ? :yeux:
je viens de te parler de db avec un champs nom qui n'est pas mis en not null, et attaqué par plusieurs appli dont t'as pas le controle.
je viens de te parler d'injection
je viens de te parler de form mal remplie par un user, avec une validation server-side, donc un nom facilement mis a null ou "".

je rajoute l'injection.
je rajoute un fetch d'un manyToOne(ou onetomany) en lazy en remote.
je rajoute un form bean, avec des properties a null lors de l'entrée dans une action.

En plus, un membre en private, meme avec setter, est accédé en 2 lignes de code manuellement, ou constamenent(sans que tu le saches) par une api comme hibernate, spring, struts...


Un personne sans nom ca existe, ca peut etre une demande fonctionelle, et on ne peut pas tj l'initialiser a "" (qui fait perde de la place, du tps cpu(vu que ca t'importe), et est sujet a bug(String est imutable)).
Je t'assure que ca n'a rien de spéciale ;)

N'hesite pas a me donner des arguments fonctionels et techniques qui fonct que ca ne peut pas etre a null... ;)

re-ps: tu bosses dans quoi? :p



[message édité le 18-06-2007 @ 18:58 Par icy]
----------
"May He touch you with His Noodly Appendage"
- Haut de page -
chip
Master
Membre # 9417

 


Messages :
375 (0.07 par jour)


Voter pour ce membre

Message du 18-06-2007 @ 18:58   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

icy a écrit


En plus, un membre en private, meme avec setter, est accédé en 2 lignes de code manuellement, ou constamenent(sans que tu le saches) par une api comme hibernate, spring, struts...



d'ou l'interet d'utiliser un tas de lib qui font n'importe quoi :D pour gagner deux lignes de code !
[edit] je me doutes bien que les lib d'apache ne font pas que ça...

tu as un exemple pour ce qui est en gras ?

[message édité le 18-06-2007 @ 19:03 Par chip]
----------
TravelMate 800 LCi
- Haut de page -
icy
Administrateur
Membre # 871

 Avatar du membre
Lieu : Bxl

Messages :
23190 (3.79 par jour)


Score :

Message du 18-06-2007 @ 19:06   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

excusme moi, une seul ligne suffit :yeux:

Xxx.class.getDeclaredField("uneVariablePrivate").get(monObjectXxx);

y'a aussi .set( ;)

Ce n'est pas pour gagner des ligne de code, mais éviter qu'un truc a la con (vu que ca prends 1 ligne) surlequel tu n'as pas le controle, modifie une membre private, qui a pourtant un setter, alors que tu ne t'y attends pas.
L'injection ce n'est que ca!

et tu m'as tj pas dis ou tu bossais :p

[message édité le 18-06-2007 @ 19:12 Par icy]
----------
"May He touch you with His Noodly Appendage"
- Haut de page -
chip
Master
Membre # 9417

 


Messages :
375 (0.07 par jour)


Voter pour ce membre

Message du 18-06-2007 @ 19:10   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

icy a écrit

excusme moi, une seul ligne suffit :yeux:

Xxx.class.getDeclaredField("uneVariablePrivate").get(monObjectXxx);


et tu m'as tj pas dis ou tu bossais :p



et ? où est le problème ?

[edit]
forcement, si on utilise ça pour faire n'importe quoi... adieu l'encapsulation
pas la peine de faire des tests à ce moment là

[edit-bis]
pour résumer, utiliser apache commons qui va vous faire pleins de tests pour éviter de tomber sur une erreur provenant de apache struts ???


[message édité le 18-06-2007 @ 19:32 Par chip]
----------
TravelMate 800 LCi
- Haut de page -
Aller à la page n°  
  Mot  Pseudo  
Page : 1 2


Aller dans le forum :  

Plan du forum | Contacter l'administrateur

Powered by SoulBB 3.0.1
© Soulmanto, 2003-2010

Valid XHTML 1.0 Transitional

Page générée en 0.084 secondes