Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1486 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Diff entre une définition dans la classe et dans le constructeur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Diff entre une définition dans la classe et dans le constructeur

n°599116
Yoyo@
Posté le 30-12-2003 à 09:09:23  profilanswer
 

Salut!
 
J'ai une question sans doute simple...
 
Je me demandais quelle était la différence entre une définition d'un attribut d'une classe dans le corps de celle ci (mais pas dans son constructeur ou dans une méthode/constructeur) et sa définition dans le constructeur. Par exemple, la différence entre :
 

Code :
  1. public class myClass{
  2.    ImageIcon[] images = new ImageIcon[8];
  3.    //...
  4. }


 
et ça :
 

Code :
  1. public class myClass{
  2.    ImageIcon[] images;
  3.    myClass(){
  4.      images = new ImageIcon[8];
  5.      //...
  6.    }
  7. }


 
Quand est ce que se fait l'allocation mémoire, etc?
 
Merci pour votre aide :hello:
 
 

mood
Publicité
Posté le 30-12-2003 à 09:09:23  profilanswer
 

n°599141
benou
Posté le 30-12-2003 à 10:36:12  profilanswer
 

dans le premier cas, l'allocation est faite avant d'entrer dans le constructeur.


---------------
ma vie, mon oeuvre - HomePlayer
n°599142
benou
Posté le 30-12-2003 à 10:36:55  profilanswer
 

perso je préfère initialiser mes variables dans le constructeur, je trouve ca plus propre, mais très souvent les gens initialisent tout ce qu'ils peuvent à la déclaration ...


Message édité par benou le 30-12-2003 à 10:37:05

---------------
ma vie, mon oeuvre - HomePlayer
n°599154
nraynaud
lol
Posté le 30-12-2003 à 10:59:29  profilanswer
 

http://forum.hardware.fr/forum2.ph [...] =4#t595378


---------------
trainoo.com, c'est fini
n°599242
Yoyo@
Posté le 30-12-2003 à 12:22:03  profilanswer
 

D'accord, très bien, merci!
 
Donc, dans tous les cas, l'allocation d'espace mémoire se fera lors de l'appel suivant :  
 

Code :
  1. MyClass maClasse = new MyClass();


 
Merci (en particulier à nraynaud pour son lien)

n°599260
Cherrytree
cn=?
Posté le 30-12-2003 à 12:38:26  profilanswer
 


Citation :

l'invariant a plus de chnaces d'être respecté à la sortie de n'importe quel constructeur


Je ne saisis pas la phrase. Je ne sais pas de quel invariant tu parles.


---------------
Le site de ma maman
n°599263
darklord
You're welcome
Posté le 30-12-2003 à 12:40:03  profilanswer
 

:ouch:

n°599268
Cherrytree
cn=?
Posté le 30-12-2003 à 12:42:16  profilanswer
 

Oui, je sais. J'ai pas appris ça à l'école. La notion d'invariant ne m'est pas familière.


---------------
Le site de ma maman
n°599272
darklord
You're welcome
Posté le 30-12-2003 à 12:45:36  profilanswer
 

cherrytree a écrit :

Oui, je sais. J'ai pas appris ça à l'école. La notion d'invariant ne m'est pas familière.


 
ah ouais carrément!  :(
 
Un exemple vraiment basique histoire d'avoir un truc concret à te mettre sous la dent
http://www.cs.cornell.edu/Courses/ [...] uests.html
 
precondition, postcondition et invariant
 

Citation :


  Precondition: h < k
    Postcondition: x = no. of elements of b[h..k-1] that do not equal the preceding element
    Invariant: h+1 <= i <= k and x = no. of elements of b[h..i-1] that do not equal the preceding element
    Bound function: k-i


Message édité par darklord le 30-12-2003 à 12:47:25
n°599277
benou
Posté le 30-12-2003 à 12:49:48  profilanswer
 


et ca te gêne pas d'un point de vue conceptuel que les initialisation ne soient pas faites dans le constructeur ?


---------------
ma vie, mon oeuvre - HomePlayer
mood
Publicité
Posté le 30-12-2003 à 12:49:48  profilanswer
 

n°599287
nraynaud
lol
Posté le 30-12-2003 à 13:00:19  profilanswer
 

de toutes façon je connais aucun prof qui conaissait.
 
l'invariant de la classe, c'est une équation logique que toutes les instances de la classe doivent vérifier.
 
Typiquement, les variables d'instance ne doivent pas être nulles, les Strings qui représentent des noms ne doivent pas être de longueur nulle, les chaches divers et variés doivent être cohérents etc. ça peut concerner tout et n'importe quoi, y compris de problèmes de synchronisation.
 
L'invariant doit être respecté chaque fois que quelqu'un a la possibilité d'utiliser l'objet, ça veut dire que pendant l'exécution d'une méthode, this peut être dans un état instable (invariant faux) à condition de revenir dans un état stable avant la fin de la méthode. Typiquement, tu modifies un objet, puis tu effaces les caches donc entre les 2 actions, les caches sont en vrac, mais c'est pas grave personne ne peut le savoir.


---------------
trainoo.com, c'est fini
n°599288
nraynaud
lol
Posté le 30-12-2003 à 13:01:34  profilanswer
 

benou a écrit :


et ca te gêne pas d'un point de vue conceptuel que les initialisation ne soient pas faites dans le constructeur ?

non.


---------------
trainoo.com, c'est fini
n°599290
benou
Posté le 30-12-2003 à 13:03:26  profilanswer
 

nraynaud a écrit :

L'invariant doit être respecté chaque fois que quelqu'un a la possibilité d'utiliser l'objet, ça veut dire que pendant l'exécution d'une méthode, this peut être dans un état instable (invariant faux) à condition de revenir dans un état stable avant la fin de la méthode. Typiquement, tu modifies un objet, puis tu effaces les caches donc entre les 2 actions, les caches sont en vrac, mais c'est pas grave personne ne peut le savoir.


<grain de sable>
seulement si les méthodes nécessitant cet invariant sont synchronizées ou que le prog est en monothread sinon c'est dtc :/ Si c'est pas le cas, le this doit être stable même pdt l'execution d'une méhode.
</grain de sable>


---------------
ma vie, mon oeuvre - HomePlayer
n°599291
benou
Posté le 30-12-2003 à 13:04:20  profilanswer
 


même si le constructeur va devoir réaffecter certaines de ces variables derrière ? (ce qui est quand même suovent le cas ...)


---------------
ma vie, mon oeuvre - HomePlayer
n°599295
nraynaud
lol
Posté le 30-12-2003 à 13:15:32  profilanswer
 

benou a écrit :


<grain de sable>
seulement si les méthodes nécessitant cet invariant sont synchronizées ou que le prog est en monothread sinon c'est dtc :/ Si c'est pas le cas, le this doit être stable même pdt l'execution d'une méhode.
</grain de sable>


Citation :

ça peut concerner tout et n'importe quoi, y compris de problèmes de synchronisation.


 
Je crois qu'il y a du boulot ici.


---------------
trainoo.com, c'est fini
n°599302
nraynaud
lol
Posté le 30-12-2003 à 13:19:55  profilanswer
 

benou a écrit :


même si le constructeur va devoir réaffecter certaines de ces variables derrière ? (ce qui est quand même suovent le cas ...)

Dans ce cas si.
Mais c'est vraiment pour me casser les couilles que tu postes ?
 
Je donne des lignes directrices, maintenant, il existe toujours des cas où c'est exactement l'inverse qu'il faut faire sauf que c'est pas la généralité.
 
Perso, j'utilise cette méthode autant que possible, ce qui veut dire pas beaucoup (parceque franchement, si rien dépendait des arguments passés aux constructeurs, on ferait tout en statique), par contre, il me parait important de garder à l'esprit la volonté d'avoir ses invariants corrects aussi tôt que possible.


---------------
trainoo.com, c'est fini
n°599304
benou
Posté le 30-12-2003 à 13:24:15  profilanswer
 

nraynaud a écrit :


Mais c'est vraiment pour me casser les couilles que tu postes ?


 :??:  
 
non c'était pour avoir ton avis ...
 
mais si c'est pour me faire accueillir comme ca je le ferrai plus  
[:neowen]


---------------
ma vie, mon oeuvre - HomePlayer
n°599312
Cherrytree
cn=?
Posté le 30-12-2003 à 13:31:06  profilanswer
 

Merci pour vos réponses. Me voilà moins bête.


---------------
Le site de ma maman
n°599347
Yoyo@
Posté le 30-12-2003 à 14:21:34  profilanswer
 

En tout cas, je suis ok avec le concept d'invriant, histoire de garder une sorte d'intégrité dans une classe! Donc, au maximum, factoriser ce qui est factorisable (sachant que le constructeur par défaut n'est pas toujours appelé)
 
En tout cas, merci, je serai moins bête, et surtout, j'ai la réponse à ma question originale !

n°599539
the real m​oins moins
Posté le 30-12-2003 à 20:05:00  profilanswer
 

hehe, ça me dit qqchose cette question :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°599894
BifaceMcLe​OD
The HighGlandeur
Posté le 31-12-2003 à 15:00:16  profilanswer
 

benou a écrit :


et ca te gêne pas d'un point de vue conceptuel que les initialisation ne soient pas faites dans le constructeur ?


De toute façon, si tu décompiles ta classe, tu te rendras compte que toutes les initialisations faites, au niveau source, hors du corps des constructeurs, sont déplacées, au niveau bytecode, au début de chacun des constructeurs de la classe.
 
Donc du point de vue flot de contrôle, les initialisations des champs non statiques sont toujours et intégralement faites dans les constructeurs.
 
Maintenant, à toi de faire attention à ne pas initialiser 2 fois le même attribut... (sachant aussi que l'initialisation par défaut à 0/false/null des attributs fait partie de la spécification du langage Java, donc inutile d'en rajouter une couche par derrière).

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Diff entre une définition dans la classe et dans le constructeur

 

Sujets relatifs
[java]Problème d'import de classe swing[C++] implémentation d'une classe générique (liste chainée)
classe graphicsclasse template amie
Héritage de classe et vectorSource de la classe LoginContext
VB + Classe - Tableau d'objetComment se servir dans une classe d'une fonction menbre d'une autre?
[Java]Appeler une méthode d'une classe à partir d'1 String [Résolu]Comment inclure une classe dans une autre?
Plus de sujets relatifs à : Diff entre une définition dans la classe et dans le constructeur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR