TP3 méthode equals

Programmation Avancée

Modérateur : Douin

a.tortevois
Messages : 47
Inscription : 05 oct. 2018 16:00
Contact :

TP3 méthode equals

Message par a.tortevois » 14 oct. 2018 18:59

Bonjour,

J'ai un doute dans ma compréhension de la méthode equals...
Est-ce qu'une pile d'interface PileI créée avec la classe Pile 2 doit être "equals" à une pile d'interface PileI mais créer avec la classe Pile 3 ?

Code : Tout sélectionner

PileI p2 = new Pile2();
PileI p3 = new Pile3();
assertTrue(p2.equals(p3)); //doit renvoyer True ?
J'aurais eu tendance à dire que ces piles peuvent être égales quelle que soit le contenant intermédiaire choisi (délégation à Sack ou Vector avec l'utilisation de leur méthodes propres) puisque implémentée par l'interface PileI et suivant les conditions données dans les notes de la question 2.1. Est-ce que c'est bien cela ?

Merci par avance.

Douin
Messages : 341
Inscription : 18 mars 2009 15:46

Re: TP3 méthode equals

Message par Douin » 14 oct. 2018 19:12

Bonsoir,

Oui c'est un sujet de discussion, elles devraient être comparables, deux implémentations de la même interface

mais comme ce n'est pas précisé dans l'énoncé et comme les méthodes de l'interface ne permettent pas de le faire simplement faites aux plus simple, i.e. deux instances de même implémentation


Bonne soirée

a.tortevois
Messages : 47
Inscription : 05 oct. 2018 16:00
Contact :

Re: TP3 méthode equals

Message par a.tortevois » 14 oct. 2018 20:10

Merci pour votre retour.

Pouvez vous donner des détails pour les erreurs suivantes svp :

1) test_Pile2_equals(question2): égalité de deux piles ?
2) test_Pile3_equals(question2): égalité de deux piles ?

Est-ce que tous les tests sont exécutés à chaque fois ou dès qu'il y a des erreurs ça s'arrête ?

Douin
Messages : 341
Inscription : 18 mars 2009 15:46

Re: TP3 méthode equals

Message par Douin » 15 oct. 2018 7:22

Bonjour ces tests sont exécutés entre deux instances de la Pile2 et Pile3 revoyez les conditions dans l'énoncé
Bon equals

a.tortevois
Messages : 47
Inscription : 05 oct. 2018 16:00
Contact :

Re: TP3 méthode equals

Message par a.tortevois » 15 oct. 2018 21:58

Bonsoir,
J'ai modifié mon code, j'obtiens bien 0 erreurs ... mais des 440 exceptions "java.lang.IllegalAccessError"
Qu'est ce que c'est ?
plusieurs appels de "System.out.println" subsistent !!!. Supprimez-les, et soumettez à nouveau
Pourtant j'ai fait attention à ce qu'ils soient tous commentés et n'affiche rien sur la console, le système analyse aussi les commentaire ?
Faut-il tous les enlever du code avant de soumettre ?

Douin
Messages : 341
Inscription : 18 mars 2009 15:46

Re: TP3 méthode equals

Message par Douin » 16 oct. 2018 10:29

Bonjour, cela vient des 2000 tests générés automatiquement par Randoop, ils ne sont pas commentés, et voilà ce que j'ai en interne
) test001(question2.Randoop_RegressionTest1)java.lang.IllegalAccessError: tried to access method java.lang.Object.clone()Ljava/lang/Object; from class question2.Randoop_RegressionTest1 )
2) test002(question2.Randoop_RegressionTest1)java.lang.IllegalAccessError: tried to access method java.lang.Object.clone()Ljava/lang/Object; from class question2.Randoop_RegressionTest1 )
3) test006(question2.Randoop_RegressionTest1)java.lang.IllegalAccessError: tried to access method java.lang.Object.clone()Ljava/lang/Object; from class question2.Randoop_RegressionTest1 )
4) test007(question2.Randoop_RegressionTest1)java.lang.IllegalAccessError: tried to access method java.lang.Object.clone()Ljava/lang/Object; from class question2.Randoop_RegressionTest1 )
5) test008(question2.Randoop_RegressionTest1)java.lang.ArrayIndexOutOfBoundsException: -1 )
...
Ces tests passent avec la version référente, cependant en l'absence de commentaires, je les inhibe cette année (les sources java générées font 20000lignes)
https://homes.cs.washington.edu/~mernst ... slides.pdf

Soumettez à nouveau en fin de matinée

a.tortevois
Messages : 47
Inscription : 05 oct. 2018 16:00
Contact :

Re: TP3 méthode equals

Message par a.tortevois » 16 oct. 2018 11:07

Bonjour,
Oui j'ai bien obtenu la même chose.
En y réfléchissant je me demandais si cela pour être du suite à une mauvaise utilisation de la méthode clone dans ma Class Pile 4 ?
J'avais dans l'idée en voyant ces erreurs que lors du test ce n'est pas la bonne méthode clone qui est utilisée (type constaté Object et non Maillon)
Si oui comment construire un test unitaire permettant de reproduire la même erreur, car quand j'empile et dépile des instances de type Object ça ne me remonte pas d'exceptions ou d'erreurs avec BlueJ ?

Douin
Messages : 341
Inscription : 18 mars 2009 15:46

Re: TP3 méthode equals

Message par Douin » 16 oct. 2018 11:46

Bonjour,

A cette adresse http://jfod.cnam.fr/progAvancee/tp3_randoop/ les fichiers générés par Randoop, attention chaque classe fait 20000 lignes et bluej a bien du mal à les gérer... j'utilise NotePad++ pour l'édition, bluej pour l'exécution
les prêts à être intégrés dans la question 2 http://lmi92.cnam.fr/progAvancee/tp3_randoop/question2/
les originaux ici http://lmi92.cnam.fr/progAvancee/tp3_ra ... generated/

Bons tests

a.tortevois
Messages : 47
Inscription : 05 oct. 2018 16:00
Contact :

Re: TP3 méthode equals

Message par a.tortevois » 16 oct. 2018 13:22

Merci pour la fourniture de ces tests.
J'ai gardé que le premier... et ça ne compile pas, il n'arrive pas à faire

Code : Tout sélectionner

java.lang.Object obj13 = pile4_6.clone();

L'erreur est :
"clone has protected access in java.lang.Object"

RENAUD
Messages : 50
Inscription : 21 sept. 2018 19:34

Re: TP3 méthode equals

Message par RENAUD » 16 oct. 2018 14:02

Bonjour
Je n'ai jamais utilisé clone(), je n'ai pas vu son utilité même si j'utilise des objets temporaires par ex. dans depiler
Dans quelle situation vous l'avez utilisé ?

a.tortevois
Messages : 47
Inscription : 05 oct. 2018 16:00
Contact :

Re: TP3 méthode equals

Message par a.tortevois » 16 oct. 2018 14:49

Bonjour,
J'ai utilisé clone dans la méthode depiler, mais j'avais fait une version sans aussi qui avait l'air de fonctionner .. (mais non soumise à JNEWS !)
Je me suis dit que si on nous donnait la méthode clone autant l'utiliser, ça avait l'air plus propre que de faire une copie d'objet à la volée qui ne recopie pas vraiment l'objet ... (si j'ai bien compris la Diapo 44 du cours 1)

Pour le clone dont on parle ci dessus c'est une méthode clone utilisée dans les tests régressifs implémenté par M. Douin via Randoop.

Bon courage ;)

Douin
Messages : 341
Inscription : 18 mars 2009 15:46

Re: TP3 méthode equals

Message par Douin » 16 oct. 2018 15:28

Re-bonjour,

C'est ce qui explique l'exception java.lang.IllegalAccessError la méthode clone doit être redéfinie dans la sous-classe, (elle est déclarée protected dans la classe Object) et aussi implémenter l'interface vide Cloneable

On peut s'en passer pour répondre au TP3...

Bonne fin de tp

MONPROFIT
Messages : 3
Inscription : 10 oct. 2018 17:51

Re: TP3 méthode equals

Message par MONPROFIT » 18 oct. 2018 15:08

Bonjour,

je ne comprend pas la facon dont la methode equals doit etre utilisé.
Vous avez écrit ce code:
public boolean equals(Object o) {...}

C'est quoi cette variable Object o ?

Je pensais qu'on l'utilise de cette facon :
pile1.equals(pile2);
hors pile2 est de type Object et non de type Pile.
Je comprend pas pourquoi on a un type Object.

Douin
Messages : 341
Inscription : 18 mars 2009 15:46

Re: TP3 méthode equals

Message par Douin » 18 oct. 2018 15:44

bonjour
public boolean equals(Object o) {...}
cf. cours2 diapositives 30..36 et ed2 (http://lmi92.cnam.fr/NFP121/supports/po ... se/enonce/)

Bonne equals

Gilles_OLLIVIER
Messages : 9
Inscription : 19 oct. 2018 15:34

Re: TP3 méthode equals

Message par Gilles_OLLIVIER » 19 oct. 2018 15:54

Bonjour,
Pour la fonction equals
Quel est le comportement attendu dans les cas suivants :

p1 = new question2.Pile();
p2 = new question2.Pile();

String s1 = new String();
s1 = "a";
String s2 = new String();
s2 = "a";

p1.empiler("s1");
p2.empiler("s2");
p1.equals(p2); doit renvoyer true ou false vu que ce sont 2 string différents mais dont les valeurs sont égales ?

pour

p1.empiler("a");
p2.empiler("a");
p1.equals(p2)); je pense que ca doit renvoyer true

Et enfin :

p1.empiler("1");
p2.empiler(1);
p1.equals(p2)); doit retourner true ou false?

P1 et P2, peuvent t'elles contenir des valeurs null ?

Merci par avance

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité