IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Instance de classe abstraite et variable non utilisée


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Par défaut Instance de classe abstraite et variable non utilisée
    Salut à tous,

    J'ai l'impression d'être bloqué avec du code qui parait simple mais dont je n'arrive pas à comprendre le mécanisme pour éviter ces erreurs.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int i;
    		GregorianCalendar test1 = new GregorianCalendar();
     
    		for (i = 0 ; i < fichierFTPs.length ; i++)
    		{
    			Calendar test2 = Calendar.getInstance();
    			test2 = fichierFTPs[i].getTimestamp();
    			System.out.println("Fichier n°"+i);
    			System.out.println("Son nom est : " + fichierFTPs[i].getTimestamp());
    		}
    Eclipse me signal que la variable test2 n'est pas utilisé. Pourtant la ligne juste en dessous de sa déclaration je l'utilise. Si je change l'utilisation de test2 avec test1 je n'ai plus d'erreur d'utilisation avec test1 mais une erreur mismatch car getTimestamps retourne un type Calendar et non GregorianCalendar

    Ainsi comme je ne peux pas travailler avec GregorianCalendar je vois que la classe Calendar possède une méthode (et non un constructeur) permettant de prendre une instance de celle-ci. Mais puisque c'est une classe abstract (Calendar) pourquoi je peux néanmoins utiliser une méthode pour prendre une instance ?

    Il existe le polymorphisme ok, mais Calendar ne possède qu'une seule sous-classe GregorianCalendar et une classe de GregorianCalendar ne veut pas travailler avec getTimestamp qui lui retourne un type Calendar.
    Comment je peux savoir à coup sur de quel type est une variable ?
    Je ne peux travailler avec aucun des 2 types....


    J'ai l'impression que le serpent ce mort la queue et je ne comprend rien.
    Pourriez-vous m'aider à comprendre les mécanismes qui implique ces erreurs svp ?




    Merci à vous,

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par miltone Voir le message
    [B]Eclipse me signal que la variable test2 n'est pas utilisé. Pourtant la ligne juste en dessous de sa déclaration je l'utilise.
    Non tu ne l'utilises pas. Tu ne fais que lui affecter des valeurs, mais tu n'y accèdes jamais...

    Dans le même ordre, l'appel à getInstance() est inutile puisque tu affectes une autre valeur derrière. Autant faire directement ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Calendar test2 = fichierFTPs[i].getTimestamp();
    Citation Envoyé par miltone Voir le message
    Mais puisque c'est une classe abstract (Calendar) pourquoi je peux néanmoins utiliser une méthode pour prendre une instance ?
    Ben getInstance() te renvoi justement une implémentation de Calendar...


    Citation Envoyé par miltone Voir le message
    Il existe le polymorphisme ok, mais Calendar ne possède qu'une seule sous-classe GregorianCalendar
    Tu présumes cela mais en réalité tu n'en sais rien...

    Citation Envoyé par miltone Voir le message
    et une classe de GregorianCalendar ne veut pas travailler avec getTimestamp qui lui retourne un type Calendar.
    Comment je peux savoir à coup sur de quel type est une variable ?
    Je ne peux travailler avec aucun des 2 types....
    Le principe c'est de travailler avec Calendar sans te soucier de l'implémentation. Donc tu ne devrais pas utiliser directement GregorianCalendar sauf besoin ultra-spécifique...



    a++

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Par défaut
    Salut MigouW et adiGuba,

    ---------------------------------------------------------------

    Non tu ne l'utilises pas. Tu ne fais que lui affecter des valeurs, mais tu n'y accèdes jamais...
    1. Eclipse dit que test2 n'est pas utilisé :
    Eclipse te signale (en warning je pense) que test2 n'est pas utilisé parce que la variable n'est jamais lue. Tu l'instancie mais tu ne t'en sert jamais dans le code (pas d'opération ou d'appel de méthode sur cette variable)
    Pourtant quand j’intervertis cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test1 = fichierFTPs[i].getTimestamp();
    Avec test1 ou test2, lorsque que je met test1, l'erreur de variable non utilisé disparait alors qu'avec test2 effectivement il est toujours là. Donc si qui est vrai pour l'un ne l'es pas pour l'autre et inversement dans ce cas.

    ---------------------------------------------------------------------
    Ben getInstance() te renvoi justement une implémentation de Calendar...
    2. Une classe abstraite signifie qu'AU MOINS UNE de ses méthodes n'est pas définie on peut donc appeler les autres. Néanmoins, l'instance retourné bien que typée avec cette classe, sera surement en réalité typée avec une classe fille.
    Très bien j'ai compris mais comment savoir précisément de quel type la classe abstraite se sert comme implémentation ?

    ----------------------------------------------------------------------

    Tu présumes cela mais en réalité tu n'en sais rien...
    Je m'appuye sur la javadoc officiel qui ne mentionne que 1 sous-classe à Calendar.
    Direct Known Subclasses : GregorianCalendar


    ---------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le principe c'est de travailler avec Calendar sans te soucier de l'implémentation. Donc tu ne devrais pas utiliser directement GregorianCalendar sauf besoin ultra-spécifique...
    3. Tu devrais utilisé une variable typé Calendar en tous les cas (sauf besoin spécifique), et ne pas te soucier de l'implémentation.
    Compris monsieurs c'est promis

    ---------------------------------------------------------------------

    Ca fait bizarre de devoir se servir uniquement d'une classe abstrait qui ne peu être instancier alors que finalement ce genre de ligne est acceptable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Calendar test2 = fichierFTPs[i].getTimestamp();
    Pour moi c'est de l'instanciation d'objet Calendar ca. Il y un principe que je ne cerne pas je pense.

    Alalalala la pratique et la théorie c'est pas pareil.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Le principe c'est de travailler avec Calendar sans te soucier de l'implémentation. Donc tu ne devrais pas utiliser directement GregorianCalendar sauf besoin ultra-spécifique...
    Personnellement je suis pas vraiment d'accord avec cette philosophie-là... La plupart du temps, mon application métier n'a pas le moindre doute sur le fait qu'elle doit travailler avec un calendrier grégorien, et certainement pas julien, républicain, traditionnel arabe ou que sais-je.

    Notamment, avec certaines configurations on peut se retrouver avec des calendriers japonais impériaux ou bouddhiques, qui comptent les années différemment. À quelques très rares exceptions près ce n'est pas ce qui est voulu, raison pour laquelle je fais explicitement new GregorianCalendar() dans une logique métier, et non pas Calendar.getInstance() dans une logique de localisation (comme si ça suffisait pour localiser correctement un calendrier...)

    (Mais ça vaut ce que ça vaut... Les calendriers japonais et bouddhiques en question sont toutefois bel et bien grégoriens, c'est juste le décompte des années qui change. Du coup ils pourraient étendre GregorianCalendar et c'est ce que fait le bouddhique. Cela ne joue pas dans les garanties de typage. C'est juste new GregorianCalendar() au lieu de Calendar.getInstance() qui assure qu'on compte bien les années.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Par défaut
    @Thelvin : En même temps, dans mon cas, ton explication est intéressante et tiens la route sauf que la fonction getTimestamps par exemple n'accepte pas de calendrier gregorian malheureusement.

    Alors si toutes les autres bibliothèque et l'API Java sont aussi conceptualisé de cette manière ca risque d'être plus prise de tête que ca pour developper car tu devra faire des tas de conversion voir peut-être re-developper des classes exprès.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par miltone Voir le message
    @Thelvin : En même temps, dans mon cas, ton explication est intéressante et tiens la route sauf que la fonction getTimestamps par exemple n'accepte pas de calendrier gregorian malheureusement.
    C'est pas faux . Je crains d'être assez hors-sujet.
    Mon petit discours est surtout dirigé contre le principe "c'est mal de faire new GregorianCalendar(), il vaut mieux faire Calendar.newInstance() et travailler de manière parfaitement générique." Non, en principe ce n'est pas logique de risquer de se retrouver avec autre chose qu'un calendrier grégorien tel que défini par Java quand on veut un calendrier grégorien tel que défini par Java.
    Mais je ne parlais que de la manière de construire un nouveau calendrier.

    Je ne parlais pas du type de tes variables test1 et test2. L'état de l'art, sur ces trucs-là, est que toutes les méthodes qui fournissent un calendrier fournissent le type Calendar. Ce n'est pas gênant. De toute façon, on ne serait pas plus avancé si c'était autre chose.
    Je parlais de construire un nouveau calendrier.

    La notation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Calendar test1 = new GregorianCalendar(); // et pas autre chose !
    est à mon sens plus logique que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Calendar test1 = Calendar.newInstance(); // et allez savoir comment il va compter les années...
    Donc oui, tes variables seront toujours de type Calendar et il n'y a aucun problème avec ça.
    Pour le coup, oui, ça devra toujours être le cas et utiliser le type GregorianCalendar à la place ne peut se faire que dans des cas très spécifiques, et ne sert pas à grand-chose.

    Et non, je ne trouve pas qu'utiliser GregorianCalendar soit ultra-spécifique, bien au contraire c'est presque toujours ce qu'il faut faire. Pas en tant que type de variable. Juste pour appeler son constructeur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 130
    Par défaut
    Quand je parlais de spécifique je me suis mal exprimé,

    En l'occurrence, ici, il essaye d'utiliser un GregorianCalendar dans sa boucle alors que la méthode getTimeStamp renvoie Calendar.

    La déclaration en GregorianCalendar n'est pas nécessaire a moins qu'il n'utilise le résultat ensuite pour une opération autre que l'affichage.

    Pour la différence entre test1 et test2 (affichage du warning), la variable test1 doit être utilisé après la boucle et donc le message n'apparait pas, alors que la variable test2 n'est pas lue, et n'existe qu'a l'interieur de la boucle.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 130
    Par défaut
    Bonjour :

    1. Eclipse dit que test2 n'est pas utilisé :
    Eclipse te signale (en warning je pense) que test2 n'est pas utilisé parce que la variable n'est jamais lue. Tu l'instancie mais tu ne t'en sert jamais dans le code (pas d'opération ou d'appel de méthode sur cette variable)

    2. Une classe abstraite signifie qu'AU MOINS UNE de ses méthodes n'est pas définie on peut donc appeler les autres. Néanmoins, l'instance retourné bien que typée avec cette classe, sera surement en réalité typée avec une classe fille.

    3. Tu devrais utilisé une variable typé Calendar en tous les cas (sauf besoin spécifique), et ne pas te soucier de l'implémentation.

    EDIT : Encore grillé par adiGuba

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.Net] Variables non-utilisées
    Par Crokan dans le forum VB.NET
    Réponses: 1
    Dernier message: 18/04/2008, 10h02
  2. [WD10] Variables non utilisées
    Par philippe30 dans le forum WinDev
    Réponses: 4
    Dernier message: 17/01/2008, 14h57
  3. Option pour voir les variable non utilisées ?
    Par lex13 dans le forum NetBeans
    Réponses: 13
    Dernier message: 25/08/2007, 12h57
  4. [VBA][02]Détection des variables non utilisées
    Par cluis dans le forum VBA Access
    Réponses: 1
    Dernier message: 22/03/2007, 10h20
  5. Remonter warnings sur variables non utilisées
    Par titomcmoi dans le forum MFC
    Réponses: 2
    Dernier message: 30/05/2006, 12h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo