Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

tester la classe d'un objet

27 réponses
Avatar
yvon.thoravalNO-SPAM
Bonjour,

j'ai un objet, disons "o", qui peut-être soit une String soit une Map,
je ne connais pas la méthode la plus élégante, disons la pus "javaish"
pour tester la classe de cette objet, ce que je fais et qui marche :

j'ai un autre objet "on" qui est toujours une String je fais donc :

String onClass = on.getClass().toString();
par ailleurs :
String oClass = o.getClass().toString();
puis je teste sans pb:

if (onClass.equals(oClass) {
faire ce qu'il faut dans ce cas là...
}

j'ai essayé, sans succès :

if ("java.lang.String".equals(oClass) {...

l'égalité n'est jamais trouvée... ce que je ne comprend pas.

d'où ma question, donc si vous avez des lumières à m'apporter, j'en
serai ravi et vous remercie d'avance...

--
yt

10 réponses

1 2 3
Avatar
remy
bonjour

if ("java.lang.String".equals(o.getClass().toString()) {...

peut etre


a+ remy

Avatar
remy
ou
http://www.laltruiste.com/document.php?url=http://www.laltruiste.com/coursja
va/operateur_instanceof.html
Avatar
yvon.thoravalNO-SPAM
remy wrote:

peut etre


ben, le test est tjs à faux... comme dans mon cas...
--
yt

Avatar
no.bcausse.spam
Yvon Thoraval wrote:

Bonjour,

j'ai un objet, disons "o", qui peut-être soit une String soit une Map,
je ne connais pas la méthode la plus élégante, disons la pus "javaish"
pour tester la classe de cette objet, ce que je fais et qui marche :

j'ai un autre objet "on" qui est toujours une String je fais donc :

String onClass = on.getClass().toString();
par ailleurs :
String oClass = o.getClass().toString();
puis je teste sans pb:

if (onClass.equals(oClass) {
faire ce qu'il faut dans ce cas là...
}

j'ai essayé, sans succès :

if ("java.lang.String".equals(oClass) {...

l'égalité n'est jamais trouvée... ce que je ne comprend pas.

d'où ma question, donc si vous avez des lumières à m'apporter, j'en
serai ravi et vous remercie d'avance...


isInstance(Object obj) ou instanceof
--
bruno Causse
http://perso.wanadoo.fr/othello

Avatar
remy
"Yvon Thoraval" a écrit dans le message de
news: 1gli2xz.165wiod1fnsqegN%
remy wrote:

peut etre


ben, le test est tjs à faux... comme dans mon cas...


public class test
{
public string toString()
{
return new String ("test");
}
}

....

String t=new String("test");
test t1=new test();
System.out.println(t.equals(t1toString()));

a teste cela doit le faire
a+ remy






--
yt



Avatar
Laurent Bossavit
Yvon,

j'ai essayé, sans succès :
if ("java.lang.String".equals(oClass) {...


C'est normal: Class.toString() renvoie une chaîne de la forme "class X",
ou X est le nom qualifié de la classe.

Comme d'autres l'ont signalé, l'opérateur instanceof est plus indiqué,
sauf que...

j'ai un objet, disons "o", qui peut-être soit une String soit une Map,
je ne connais pas la méthode la plus élégante, disons la pus "javaish"
pour tester la classe de cette objet, ce que je fais et qui marche :


A l'exception des méthodes qui surchargent equals(), tester la classe
d'un objet est presque toujours signe d'un défaut de conception.

En l'occurrence, une String et une Map n'ont pas le même contrat, il
semble donc extrêmement étrange de pouvoir les rencontrer dans une même
référence polymorphique.

Es-tu sûr que ta conception actuelle est satisfaisante ?

Laurent
http://bossavit.com/thoughts/

Avatar
Thibaut Desmarest
A l'exception des méthodes qui surchargent equals(), tester la classe
d'un objet est presque toujours signe d'un défaut de conception.


Euh juste pour me rassurer alors, j'aimerais savoir si d'après toi mon
utilisation de instanceof est justifiée ou si elle découle d'un défaut
de conception :

J'ai ajouté dans mon programme un KeyListener sur la touche Entrée qui
permet de passer le Focus, un peu comme la touche TAB.

Dans le keyTyped, je fais des tests avec instanceof pour savoir
quel est le type de JComponent qui avait le focus.

instanceof JTextField, instanceof JButton etc... Pour faire des
traitements différents...

Y'avait t'il une manière plus intelligente de procéder ?

Merci d'avance,


Thibaut

Avatar
remy
Dans le keyTyped, je fais des tests avec instanceof pour savoir
quel est le type de JComponent qui avait le focus.
regarde dans ton fichier scr.jar recherche focus


il y a FocusEvent.java et FocusListener .java

peut etre

a+ remy

Avatar
Laurent Bossavit
Thibaut,

instanceof JTextField, instanceof JButton etc... Pour faire des
traitements différents...


Différents de quelle manière ?

Y'avait t'il une manière plus intelligente de procéder ?


Dans la mesure où tu n'as pas la main sur la hiérarchie de classes de
Swing, je n'en mettrais pas ma tête à couper. Normalement, tu remplaces
le test sur la classe par un appel polymorphique. Dans ce cas précis, tu
ne peux pas le faire directement. Il faut utiliser un Decorator (*), ou
alors changer complètement d'algorithme comme le suggère Rémy.

Lorsque tu examines la classe pour déterminer le bon comportement, le
problème que tu créées est le suivant: à chaque fois que tu veux prendre
en compte une nouvelle sous-classe de JComponent dans ta hiérarchie
(mettons que tu rajoutes à ton application un JAudioSampleButton qui te
permet de choisir un son, alors que tu n'en avais pas eu besoin jusqu'à
présent) tu dois ajouter un cas à ton test.

Il serait préférable que toutes les modifications nécessaires pour
prendre en compte un JAudioSampleButton soient contenues... dans
JAudioSampleButton, et pas ailleurs.

(*) Un exemple de Decorator pour la hiérarchie JComponent:
http://www.onjava.com/pub/a/onjava/2003/02/05/decorator.html

Laurent
http://bossavit.com/thoughts/

Avatar
yvon.thoravalNO-SPAM
remy wrote:

http://www.laltruiste.com/document.php?url=http://www.laltruiste.com/coursja
va/operateur_instanceof.html


ok merci beaucoup, ça marche impec et surtout, ça me paraît plus clean
que ce que j'avais fait...
--
yt

1 2 3