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

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

Marsh Posté le 30-12-2003 à 09:09:23    

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:
 
 

Reply

Marsh Posté le 30-12-2003 à 09:09:23   

Reply

Marsh Posté le 30-12-2003 à 10:36:12    

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


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 30-12-2003 à 10:36:55    

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
Reply

Marsh Posté le 30-12-2003 à 10:59:29    

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


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 30-12-2003 à 12:22:03    

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)

Reply

Marsh Posté le 30-12-2003 à 12:38:26    


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
Reply

Marsh Posté le 30-12-2003 à 12:40:03    

:ouch:

Reply

Marsh Posté le 30-12-2003 à 12:42:16    

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
Reply

Marsh Posté le 30-12-2003 à 12:45:36    

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
Reply

Marsh Posté le 30-12-2003 à 12:49:48    


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
Reply

Marsh Posté le 30-12-2003 à 12:49:48   

Reply

Marsh Posté le 30-12-2003 à 13:00:19    

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
Reply

Marsh Posté le 30-12-2003 à 13:01:34    

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
Reply

Marsh Posté le 30-12-2003 à 13:03:26    

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
Reply

Marsh Posté le 30-12-2003 à 13:04:20    


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
Reply

Marsh Posté le 30-12-2003 à 13:15:32    

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
Reply

Marsh Posté le 30-12-2003 à 13:19:55    

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
Reply

Marsh Posté le 30-12-2003 à 13:24:15    

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
Reply

Marsh Posté le 30-12-2003 à 13:31:06    

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


---------------
Le site de ma maman
Reply

Marsh Posté le 30-12-2003 à 14:21:34    

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 !

Reply

Marsh Posté le 30-12-2003 à 20:05:00    

hehe, ça me dit qqchose cette question :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 31-12-2003 à 15:00:16    

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).

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed