Bonjour,
J'ai des canaris qui se nomme par différents identifiants
1.1212.04
2.1212.04
54.1212.03
N° de bague . Stam . Année
Stam = numéro d'éleveur
La question de grand débutant : :)
1.1212.04 est un String ou un interger ???
Version imprimable
Bonjour,
J'ai des canaris qui se nomme par différents identifiants
1.1212.04
2.1212.04
54.1212.03
N° de bague . Stam . Année
Stam = numéro d'éleveur
La question de grand débutant : :)
1.1212.04 est un String ou un interger ???
si tu veux les '.' entre les chiffres, ce n'est pas un Integer!
Les String sont plus maniables que les Integer. Par contre, tu peux pas faire d'operations (encore que tu as des methodes pour les convertir en int).
Bref, si tu n'as pas à faire des opérations, ce sont des String!
A voir ton format, ce devrait plutôt être un string... (dû aux plusieurs points 1.1212.04)
Mais comme tu as des règles strictes qui définissent ton numéro, je pense que je ferais un objet qui va contenir trois variables : (déclarations)
Et qui va implémenter les méthodes de contrôles, d'écriture, ... tout ce que tu as besoin au niveau de ton identifiant de canari...Code:
1
2
3
4
5
6
7 //Numéro de la bague private Integer nBague = null; //Numéro de l'éleveur private Integer stam = null; //Année private String annee = null;
A+
Une String toute simple ne semble pas être la bonne solution, parceque il va falloir concaténer les chaînes et les découper... Le mieux c'est d'utiliser un tableau:
String[3]
ou
int[3]
Bonjour,
Pour ma culture, peux tu m'expliquer pourquoi, il ne faut pas concaténer les chaînes ?
En gros la fonctionnalité principale de mon programme est la généalogie.
J'aurai besoin par la suite pourvoir récupérer l'année de l'identifiant pour ouvrir le fichier corespondant
Le pére de 1.1212.04 est 9.1212.02
J'ouvre le fichier 2002.xml pour récupérer les informations sur le pére
La mére de 1.1212.04 est 87.5189.03
J'ouvre le fichier 2003.xml pour récupérer les information sur la mère
Je suis de l'avis de petitjack ...
Il vaut mieux créer son propre objet car comme cela, tu pourras utiliser les différentes élements de l'identifiant sans avoir à toujours parser et découper ta chaine de caractére ...
De plus, tu pourras rajouter des méthodes à ton identifiant afin de faire certaine traitement lui étant destiné, l'objet et ses données devient alors indépendant et tu pourras réutiliser ton composant la ou tu souhaite.
Exemple de code :
Ainsi dans ton exemple, pour récupérer l'année, tu n'a besoin que de utiliser la méthode getAnnee() ...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 public class IdentifiantCanari { private int bague; private int stam; private int annee; public IdentifiantCanari(int _bague, int _stam, int _annee) { bague=_bague; stam=_stam; annee=_annee; } public int getBague() { return bague; } public int getStam() { return stam; } public int getAnnee() { return annee; } public void setBague(int _bague) { bague=_bague; } public void setStam(int _stam) { stam=_stam; } public void setAnnee(int _annee) { annee=_annee; } public String toString() { return bague+"."+stam+"."+annee; } public int hashCode() { return toString().hashCode(); } public boolean equals(Object o) { if(o!=null && o instanceof IdentifiantCanari && toString().equals(o.toString())) return true; else return false; } }
Alors que si tu fait un String il faut que tu parse ta chaine jusqu'au deuxiéme point, puis tu découpe ta chaine du deuxiéme point à la fin de la chaine, enfin tu converti cette chaine decoupe en entier ... beaucoup de traitement inutile ...
J'ai déjà une class canari....
C'est justement pour modifier celle-ci :wink:
Par contre, je ne comprend pas ce code :oops: désolé :oops: :
Code:
1
2
3
4
5
6
7 public int hashCode() { return toString().hashCode(); } public boolean equals(Object o) { if(o!=null && o instanceof IdentifiantCanari && toString().equals(o.toString())) return true; else return false; }
la méthode equals sert à comparer 2 identifiants de canari, si l'identifiant passé en paramétre de la méthode equals identifie le même canari que l'objet dont tu a appellé la méthode, il renverra true.
C'est une surcharge de la méthode equals de java.lang.Object
Idem pour la méthode hashCode() qui permet de stocker ton objet dans une java.util.HashMap ou un java.util.HashSet ...
tu as deja une classe Canari, et dans cette classe tu auras un identifiant du type IdentifiantCanari.
C'est effectivement la meilleure solution dans ton cas, de cette facon tu peux implementer les methode "getPere", "getMere" .... tres facilement!
Salut,
La méthode hashCode() (hérité de Object) permet de définir un numéro d'identifiant unique...
Par défaut, chaque instance de ta classe Canari possède un hashCode différent.
En redéfinnissant hashCode() de la sorte, cela te permet de garder le même hashcode pour deux instances du même Canari (même identifiant).
De même, la méthode equals() (également hérité de Object) permet de comparer ton instance de Canari avec un autre Object.
Dans la condition, il verifie respectivement que l'objet n'est pas null, qu'il correspond bien a une instance de IdentifiantCanari et que ses deux identifiant sont egaux...
Par defaut equals() renvoi true seulement si les deux références sont identiques ( this==o ).
Ces deux méthodes servent surtout dans les Collections et les Maps pour comparer les objets...
a++
en gros ça compare si l'identifiant du canari existe pour éviter d'avoir deux fois le même identifiant?
C'est surtout afin de comparer deux instances différentes...Citation:
Envoyé par pingoui
Ca permet d'utiliser correctement des Set (liste d'éléments uniques) ou encore comme clef dans une Map...
Voici ma class canari:
Il me faut donc créer un class IdentifiantCanariCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 public class Canari { private String nom; private String sexe; private int stam; private int bague; private int year; public Canari() {} public Canari(String nom,String sexe,int stam,int bague, int year) { setNom(nom); setSexe(sexe); setStam(stam); setBague(bague); setYear(year); } public void setNom(String nom) { this.nom=nom;} public void setSexe(String sexe) { this.sexe=sexe;} public void setStam(int stam) { this.stam=stam;} public void setBague(int bague) { this.bague=bague;} public void setYear(int year) { this.year=year;} public String getNom() { return nom;} public String getSexe() { return sexe;} public int getStam() { return stam;} public int getBague() { return bague;} public int getYear() { return year;} }
Puis remplacer les getNom et setNom par la class IdentifiantCanari
Suprprimer les doublons dans la class canari (Stam, Bague et Year)
:?:
A quoi correspond le Nom ???
Maintenant, c'est l'identifiant
Pour apprendre java, je m'amusais à travailler avec des noms de canari de type "titi" "momo", etc....
Maintenant nom = identifiant !
Ok !
En fait la classe IdentifiantCanari de Debernad correspond à ta classe Canari
Tu n'a plus directement besoin de l'identifiant car il contient des informations redondante avec les trois attributs stam, baque et year.
Mais tu peux toujours le recuperer grâce à la méthode toString().
Par contre tu peux toujours créer un second constructeur avec en paramètre l'identifiant :
que tu utilises comme cela :Code:
1
2
3
4
5
6
7
8
9 public Canari(String identifiant) throws Exception { String[] tab = identifiant.split ("\\."); if (tab.length!=3) throw new Exception ("Identifiant incorrect [" + identifiant + "]."); bague= tab[0]; stam= tab[1]; annee= tab[2]; }
Code:Canari c = new Canari ("54.1212.03");
Apparament, ça ne correspond pas au code de Debernad
Tu utilises des Strings[].... de plus creer un nouvel objet.
Ne vaut il pas mieux faire:
:?:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public class Canari { private String identifiant; private String sexe; private int stam; private int bague; private int year; public Canari() {} public Canari(String _identifiant,String _sexe) { identifiant=_identifiant; sexe=_sexe; } public String getSexe() { return sexe;} public int getStam() { return stam;} public int getBague() { return bague;} public int getYear() { return year;} public void setNom(String _nom) { this.nom=_nom;} public void setSexe(String _sexe) { this.sexe=_sexe;} public void setStam(int _stam) { this.stam=_stam;} public void setBague(int _bague) { this.bague=_bague;} public void setYear(int _year) { this.year=_year;} public String getIdentifiant() { return bague+"."+stam+"."+year;} }
Je montrais juste un second constructeur possible pour la classe Canari.Citation:
Envoyé par pingoui
soit tu crée ton canari avec les infos stam, bague et year en tant que valeur entière :
soit avec le constructeur que je t'ai indiqué tu analyses l'identifiant :Code:Canari c = new Canari (sexe, 14, 2240, 02);
PS: tu peux rajouter le sexe que je n'ai pas mis...Code:Canari c = new Canari ("14.2240.02");
Le but : Ton objet Canari contient 3 attributs stam, bague et year.
Stocker l'identifiant est une redondance des informations...
Dans le dernier code que tu as posté, lors de la creation de ton objet Canari, ces trois attributs ne sont pas initialisé !!
De plus, ton attribut identifiant ne sert a rien car il n'est utiliser que dans le constructeur. Ta méthode getIdentifiant() re-crée cet identifiant...
Je souhaite appeller mes canaris par leurs identifiants dans le reste du code.
Et souhaite ajouter des canaris de la façon suivante
Et avoir un méthode qui me permet de récupérer l'année de l'identifiant 1.1212.04 par exempleCode:
1
2
3 Canari unCanari = new Canari(1.1212.04,mâle); add(unCanari);
A vrai dire je suis un peu paumé... trop d'informations nuit à la compréhension....je bosse sur trop de truc en même temps... j'ai besoin de vacances 8) ....même si j'en reviens :)Code:Canari.getAnnee(1.1212.04);
:D
C'est mieux comme ça? :?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 public class Canari { private String identifiant; private String sexe; private int stam; private int bague; private int year; public Canari() {} public Canari(String _identifiant,String _sexe) { identifiant= bague+"."+stam+"."+year; sexe=_sexe; } public String getSexe() { return sexe;} public int getStam() { return stam;} public int getBague() { return bague;} public int getYear() { return year;} public void setSexe(String _sexe) { this.sexe=_sexe;} public void setStam(int _stam) { this.stam=_stam;} public void setBague(int _bague) { this.bague=_bague;} public void setYear(int _year) { this.year=_year;} }
A quoi sert ton argument String _identifiant?Citation:
public Canari(String _identifiant,String _sexe) {
identifiant= bague+"."+stam+"."+year;
sexe=_sexe;
}
Code:
1
2
3
4 public Canari(String _sexe) { identifiant= bague+"."+stam+"."+year; sexe=_sexe; }
Redefini egalement tes methodes :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 public class Canari { private String identifiant; private String sexe; private int stam; private int bague; private int year; public Canari() {} public Canari(String _sexe) { identifiant= bague+"."+stam+"."+year; sexe=_sexe; } public String getSexe() { return sexe;} public int getStam() { return stam;} public int getBague() { return bague;} public int getYear() { return year;} public void setSexe(String _sexe) { this.sexe=_sexe; } public void setStam(int _stam) { this.stam=_stam; identifiant= bague+"."+stam+"."+year; } public void setBague(int _bague) { this.bague=_bague; identifiant= bague+"."+stam+"."+year; } public void setYear(int _year) { this.year=_year; identifiant= bague+"."+stam+"."+year; } }
[quote="viena"]
A quoi sert ton argument String _identifiant?
[quote]
Pour moi un canari, c'est un identifiant, un sexe, un pére, une mére.
je suis de + en + paumé.... :roll:
8O :?
vi, mais dans ton constructeur, tu passes un argument "identifiant", mais tu t'en sert pas...
moi je passerai plutot un stam une bague et un year pour contruire l'identifiant apres a voir ton code...
mais bon...
Pour ajouter un canari dans un fichier xml, je fais :
Mon but est d'avoir un code propre qui me permet:Code:
1
2
3
4
5
6
7 String bague = comboBague.getSelectedItem().toString(); String stam = textStam.getText(); String year = textYear.getText(); String indentifiant = bague+"."+stam+"."+year; String sexe = comboSexe.getSelectedItem().toString(); Canari unCanari = new Canari(indentifiant,sexe);
:arrow: D'avoir un numéro identifiant de type Bague.Stam.Year
:arrow: De pouvoir récupérer l'année sans devoir décomposer l'identifiant
De plus, par la suite (il faut peut être que j'y pense maintenant d'ailleurs lol) je veux associer au canari l'identifiant de son père et de sa mére.
:f1:
Et comme ça?
:? :?: :?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public class Canari { private String identifiant; private String sexe; private int stam; private int bague; private int year; public Canari() {} public Canari(String _identifiant,String _sexe) { identifiant= _identifiant; sexe=_sexe; } public String getIdentifiant() { return identifiant;} public String getSexe() { return sexe;} public int getBague(String _identifiant) { return bague;} public int getStam(String _identifiant) { return stam;} public int getYear(String _identifiant) { return year;} public void setIdentifiant(String _identifiant){_identifiant= bague+"."+stam+"."+year;} }
Ces trois méthodes sont incorrect.Code:
1
2
3 public int getBague(String _identifiant) { return bague;} public int getStam(String _identifiant) { return stam;} public int getYear(String _identifiant) { return year;}
Les attributs bague, stam et year ne sont jamais initialisé...
De plus, pourquoi passé _identifiant en paramètre ? surtout que ce n'est pas utilisé...
Tu ne peut pas modifier une String passé en paramètres...Code:public void setIdentifiant(String _identifiant){_identifiant= bague+"."+stam+"."+year;}
Cette méthode "ne fait rien"...
Tu devrais lire des cours sur la prog. Java car j'ai l'impression que tu t'embrouilles un peu...
Tu as un objet Canari.
Qu'est-ce qui caractérise un Canari ?
4 attributs :
- sexe
stam
bague
year
identifiant n'est pas un vrai attributs du fait qu'il est constitué de la valeur de 3 autres attributs
Donc on obtient le code suivant :
Ton identifiant est créé avec les valeurs de tes différents attributs :Code:
1
2
3
4
5
6
7
8
9
10
11 public class Canari { private String sexe; private int stam; private int bague; private int year; public String getSexe () { return this.sexe; } public int getStam () { return this.stam; } public int getBague () { return this.bague; } public int getYear () { return this.year; } }
Maintenant il faut ecrire les constructeurs.Code:
1
2
3 public String getIdentifiant () { return this.stam + "." + this.bague + "." + this.year; }
Le role d'un constructeur est d'initialisé les attribut d'une classe.
Tu as deux choix : soit tu lui passes TOUT les attributs de ta classe :
Soit tu lui passe un identifiant que tu découpes pour récuperer les autres attributs (cf. mon code de debut de la 2nd page)Code:
1
2
3
4
5
6 public Canari (String sexe, int stam, int bague, int year) { this.sexe = sexe; this.stam = stam; this.bague = bague; this.year = year; }
a++
perso, je trouve ca pourri d'envoyer en argument du constructeur un champs construit par d'autre attribut...
de meme, je vois pas l'interet de mettre en memoire l'attribut or que tu as ses composantes!
Ton bean, selon moi, doit resembler a ca :
Pareil, pour la suite, sache qu'en vision objet, on mettrait plutot des references sur les objets "mere" et "pere" que leur identifiants (ce qui est plus une vision merisienne).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public class Canari { private String sexe; private int stam; private int bague; private int year; public Canari() {} public Canari(int _stam,int _bague,int _year,String _sexe) { stam=_stam; year=_year; bague=_bague; sexe=_sexe; } public String getIdentifiant() { return "" bague+"."+stam+"."+year ;} public String getSexe() { return sexe;} public int getBague(String _identifiant) { return bague;} public int getStam(String _identifiant) { return stam;} public int getYear(String _identifiant) { return year;} //+setters si besoin }
Cependant, si tu as un graphe tres lours... pourquoi pas...
Effectivement je m'embrouille les pinceaux aujourd'hui ! :(
Je souhaite stocker dans mon fichier.xml les données comme suit:
En faisant :Code:
1
2
3
4
5
6
7
8
9
10
11 <Annee> <Canari> <identifiant>1.1212.03</identifiant> <sexe>mâle</sexe> <pere>87.1212.01</pere> <mere>56.5493.02</mere> </Canari> <Canari></Canari> <Canari></Canari> </Annee>
je stocke dans mon fichier.xml les données comme ça:Code:
1
2
3
4
5
6
7 public Canari(int _stam,int _bague,int _year,String _sexe) { stam=_stam; year=_year; bague=_bague; sexe=_sexe; }
Le problème est que je vais avoir beaucoup de champ par canari en plus.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 <Annee> <Canari> <bague>1.1212.03</bague> <stam>1212</stam> <year>03<year> <sexe>mâle</sexe> <pere>87.1212.01</pere> <mere>56.5493.02</mere> </Canari> <Canari></Canari> <Canari></Canari> </Annee>
De plus, je veux éviter de faire lors d'une recherche dans mon fichier.xml
une recherche de type :
bague & stam & year
Toutes les informations contenues dans le fichier.xml sont affichées dans une JTable.
je souhaite éviter d'avoir plusieurs colonnes
|bague|stam|year|.....
:arrow: Comment puis-je récupérer les différents composant de l'identifiant si je fais:
:?:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 public class Canari { private String identifiant; private String sexe; public Canari() {} public Canari(String _identifiant,String _sexe) { identifiant=_identifiant; sexe=_sexe; } public String getIdentifiant() { return identifiant;} public String getSexe() { return sexe;} public void setIdentifiant(String _identifiant){identifiant=_identifiant;} public void setSexe(String _sexe) { sexe=_sexe;} } }
Je sais que c'est prendre le problème à l'envers par rapport à votre raisonement, mais je souhaite avoir un canari avec les arguments (identifiant et sexe)
Si j'utilise les arguments (bague, stam, year,sexe), je reviens en arrière et ne fais pas avancer le chmilblique (c'est aussi dur à l'écrire qu'a prononcer...lol)
Lorsqu'une personne va consulter manuellement le fichier.xml, ça sera beaucoup plus parlant de voir directement l'identifiant.
Et si je peux par la suite décomposer l'identifiant facilement par la suite, c'est le top !
Du genre :
getStam(1.1212.03)
Résultat = 1212
Merci pour votre aide et pour votre patience :oops:
Salut,
Par exemple :
Lorsque tu crée un objet Canari avec les infos récupéré depuis le XML :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public class Canari { private String sexe; private int bague; private int stam; private int annee; public Canari(String identifiant, String _sexe) throws Exception { String[] tab = identifiant.split ("\\."); if (tab.length!=3) throw new Exception ("Identifiant incorrect [" + identifiant + "]."); stam = Integer.parseInt (tab[0]); bague = Integer.parseInt (tab[1]); annee = Integer.parseInt (tab[2]); sexe = _sexe; } public String getSexe () { return this.sexe; } public int getStam () { return this.stam; } public int getBague () { return this.bague; } public int getYear () { return this.year; } public String getIdentifiant () { return this.stam + "." + this.bague + "." + this.year; } }
Le constructeur découpe les différents champs de l'identifiant et renseigne les attributs de la classe.Code:Canari c = new Canari (identifiant, sexe);
Dans le premier code posté j'avais oublié les Integer.parseInt() :oops:
Tu peux très bien utiliser un attribut identifiant.
En le regénérant cela permet de modifier les attributs bague, stam et year (avec des eventuels setters) et de repercuter automatiquement sur l'identifiant...
Ok merci :)
et pour les setter.... je fais comment?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 public class Canari { private String identifiant; private String sexe; private int bague; private int stam; private int year; public Canari() {} public Canari(String _identifiant,String _sexe) throws Exception{ String[] tab = _identifiant.split ("\\."); if (tab.length!=3) {throw new Exception ("Identifiant incorrect [" + identifiant + "]."); } stam = Integer.parseInt (tab[0]); bague = Integer.parseInt (tab[1]); year = Integer.parseInt (tab[2]); sexe = _sexe; } public String getSexe () { return sexe; } public int getStam () { return stam; } public int getBague () { return bague; } public int getYear () { return year; } public String getIdentifiant () { return stam + "." + bague + "." +year; } }
Tu t'obstines à vouloir garder une variable identifiant...
[référencé dans le bout de code que tu viens de mettre en exemple, est-ce volontaire ?, si c'est le cas :
En interne à ta classe, tu n'en as pas besoin, juste ? C'est donc d'autres objets ou références de Canaris qui vont demander quel est l'identifiant de ton canari courant, juste ?
Donc, la méthode suivante suffi...
]Code:
1
2
3
4 public String getIdentifiant () { return this.stam + "." + this.bague + "." + this.year; }
Ce qui te donne comme setter :
Code:
1
2
3
4
5 public void setSexe (String _sexe) { sexe=_sexe; } public void setStam (int _stam) { stam=_stam; } public void setBague (int bague) { bague=_bague; } public void setYear (int _year) { year=_year; }
c'est juste... c'est pourquoi j'ai adopté le
de adiGuba :wink:Code:
1
2
3
4 public String getIdentifiant () { return this.stam + "." + this.bague + "." + this.year; }
Merci pour les setters
:)
J'y ai pensé... C'est pourquoi j'ai mis des "[ ]"... C'était au cas où...Citation:
Envoyé par pingoui
ça semble jouer maintenant ? :yaisse:
Merci beaucoup pour votre patience.... vous êtes tous extra :king:
Dans le reste de mon code,
J'ai une méthode pour modifier l'identifiant d'un canari par exemple.
Pour cela, je recherche les canaris correspondant à l'identifiant puis je "faisait" un setNom
Le nom correspondais avant à mon identifiant !
Vous voyez donc dans l'exemple précédent que je ne peux directement pas "setter" l'identifiant.Code:
1
2
3
4
5 public void setCanari(String oldIdentifiant, String newIdentifiant){ Canari canariAModifier = getCanari(nomCanari); if(canariAModifier!=null) canariAModifier.setIndentifiant(newIdentifiant); }
:arrow: Comment puis-je faire pour modifier l'identifiant? Dois-je setter bague, stam et year???
merci
Tu peux faire une méthode du type :
Et alors, tu peux même changer ton constructeur en :Code:
1
2
3
4
5
6
7
8
9
10 public void setIdentifiant(String _identifiant) throws Exception { String[] tab = _identifiant.split ("\\."); if (tab.length!=3) {throw new Exception ("Identifiant incorrect [" + identifiant + "]."); } stam = Integer.parseInt (tab[0]); bague = Integer.parseInt (tab[1]); year = Integer.parseInt (tab[2]); }
Code:
1
2
3
4
5 public Canari(String _identifiant,String _sexe) throws Exception{ setIdentifiant(_identifiant); sexe = _sexe; }
Ok ça me semble correct !
Par contre, j'ai cette erreur
En faisant:Code:Unhandled exception type Exception
et/ou en faisantCode:
1
2
3
4
5 public void setCanari(String oldIdentifiant, String newIdentifiant){ Canari canariAModifier = getCanari(nomCanari); if(canariAModifier!=null) canariAModifier.setIndentifiant(newIdentifiant); }
dans ma méthode pour ajouter un canari à mon fichier !Code:
1
2
3
4
5
6
7 String bague = comboBague.getSelectedItem().toString(); String stam = textStam.getText(); String year = textYear.getText(); String indentifiant = bague+"."+stam+"."+year; String sexe = comboSexe.getSelectedItem().toString(); Canari unCanari = new Canari(indentifiant,sexe);
:? :?
J'ai enlevé les throws Exception et ça marche
:?
Dites moi ce que vous en pensez?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 public class Canari { private String sexe; private int bague; private int stam; private int year; public Canari() {} public Canari(String _identifiant,String _sexe) { setIdentifiant(_identifiant); sexe = _sexe; } public String getSexe () { return sexe; } public int getStam () { return stam; } public int getBague () { return bague; } public int getYear () { return year; } public String getIdentifiant () { return stam + "." + bague + "." + year; } public void setSexe (String _sexe) { sexe=_sexe; } public void setStam (int _stam) { stam=_stam; } public void setBague (int _bague) { bague=_bague; } public void setYear (int _year) { year=_year; } public void setIdentifiant(String _identifiant) { String[] tab = _identifiant.split ("\\."); /*if (tab.length!=3) {throw new Exception ("Identifiant incorrect [" + _identifiant + "]."); } */ stam = Integer.parseInt (tab[0]); bague = Integer.parseInt (tab[1]); year = Integer.parseInt (tab[2]); } }
Merci pour tout !
Ca n'a pas l'air mal du tout
Le fait de lever une exception dans ta méthode permet au client qui l'a appellé de savoir que quelque chose s'est mal passé. Dans ton cas, c'est lui permettre de savoir que l'identifiant qu'il a passé est non valide. Cette fonctionnalité me paraît importante dans ton cas.
La solution avec le "throw new Exception()" décommenté est :
Pour le constructeur :Code:
1
2
3
4
5
6
7
8
9
10 public void setIdentifiant(String _identifiant) throws Exception { String[] tab = _identifiant.split ("\\."); if (tab.length!=3) {throw new Exception ("Identifiant incorrect [" + identifiant + "]."); } stam = Integer.parseInt (tab[0]); bague = Integer.parseInt (tab[1]); year = Integer.parseInt (tab[2]); }
Pour les méthodes qui appelleront soit le constructeur soit la méthode setIdentifiant :Code:
1
2
3
4 public Canari(String _identifiant,String _sexe) throws Exception{ setIdentifiant(_identifiant); sexe = _sexe; }
Les exceptions en java ne sont pas seulement pour que le développeur se dise, "Et merde, encore une erreur...", mais pour avertir le développeur que l'execution du code a eu un problème. D'ailleur, la plupart des exceptions levées, sont catchée et donc traitées et donc invisible au client. Une bonne gestion d'exceptions fait partie te toute bonne analyse java.Code:
1
2
3
4
5
6
7
8
9
10
11
12 //Dans le corps de la méthode cliente, instanciation de la classe Canari Canari canari = null; try{ canari = new Canari("/*identifiant*/", "/*sexe*/"); } catch(Exception e){ //Suppose que ton identifiant est invalid (ex : 1234), comment réagit //l'instance canari sans le fait de lever une exception ? Et bien tu as une //instance canari qui est invalide. En levant une exception, tu vas //passer par le catch de l'exception et pouvoir faire un traitement... //(Donc par ce bout de code...) }