OVH Cloud OVH Cloud

constructeur privé ?

18 réponses
Avatar
devoo
Bonjour à tous,

Voila, en lisant des bouts de code, je suis tombé sur cela :

private myClass(){}

public static myClass getInstance(){
if(myInstance==null){
myInstance = new DAOODBCFactory();
}
return myInstance;
}

Je vois pas bien l'utilité de mettre le constructeur en privé et de
créer une méthode public pour obtenir une instance.
A première vue, je pensais que cela éviter d'instancier plusieurs fois
le même objet, mais je n'en suis pas sur.

Si vous pouviez m'elcairer.

D'avance merci.

8 réponses

1 2
Avatar
Bruno CAUSSE
dans l'article , Stephane
Zuckerman à a écrit le 18/05/05 10:40 :

Euh ben le bloc static ne sera exécuté qu'une fois a priori non ?



Bonne question. Les blocs "static" sont t'ils synchronisés?


Avatar
Arnaud Berger
Pas besoin, les blocs statiques sont exécutés une seule fois, au chargement
de la classe par le ClassLoader (je suppose) .

Cordialement,

Arnaud



"Bruno CAUSSE" a écrit dans le message news:
BEB0D688.3C41%
dans l'article , Stephane
Zuckerman à a écrit le 18/05/05 10:40 :

Euh ben le bloc static ne sera exécuté qu'une fois a priori non ?



Bonne question. Les blocs "static" sont t'ils synchronisés?





Avatar
Bruno CAUSSE
dans l'article d6fisk$knt$, Arnaud Berger à
a écrit le 18/05/05 16:19 :

Pas besoin, les blocs statiques sont exécutés une seule fois, au chargement
de la classe par le ClassLoader (je suppose) .


A bon? et si 2 deux threads ont besoin de de la classe au meme instant ou
avant que l'init soit finie. Qui gere ce cas?

Avatar
Kupee
Bruno CAUSSE wrote:
Pas besoin, les blocs statiques sont exécutés une seule fois, au chargement
de la classe par le ClassLoader (je suppose) .



A bon? et si 2 deux threads ont besoin de de la classe au meme instant ou
avant que l'init soit finie. Qui gere ce cas?


Ben si c'est le classloader il gère, d'ailleurs je pense pas qu'il
charge 2 fois la meme classe si 2 threads veulent y accéder avant que le
chargement de la classe soit fini.
D'autre part sur quoi tu veux le synchroniser ton bloc static ?
Le seul choix est de le synchroniser sur un champ static d'une classe,
et pareil, qui te dis que cce champ sera pas instantié 2 fois pour les
mêmes raisons ?


Avatar
Arnaud Berger
Avoir besoin de la classe ne signifie pas qu'elle est à nouveau chargée.
Une classe n'est chargée dans la VM qu'une seule fois (sauf utilisation de
loadLibrary, et encore).


"Bruno CAUSSE" a écrit dans le message news:
BEB11D1F.3C8B%
dans l'article d6fisk$knt$, Arnaud Berger à
a écrit le 18/05/05 16:19 :

Pas besoin, les blocs statiques sont exécutés une seule fois, au
chargement


de la classe par le ClassLoader (je suppose) .


A bon? et si 2 deux threads ont besoin de de la classe au meme instant ou
avant que l'init soit finie. Qui gere ce cas?




Avatar
Bruno CAUSSE
dans l'article 428b5224$0$24103$, Kupee à
a écrit le 18/05/05 16:33 :

Ben si c'est le classloader il gère, d'ailleurs je pense pas qu'il
charge 2 fois la meme classe si 2 threads veulent y accéder avant que le
chargement de la classe soit fini.


Donc le deuxieme thread attend que la classe soit completement chargée par
le premier avant de l'utilisé. Sans jouer sur les mots si ce n'est pas de la
synchronisation c'est quoi?

Avatar
Kupee
Bruno CAUSSE wrote:
dans l'article 428b5224$0$24103$, Kupee à
a écrit le 18/05/05 16:33 :


Ben si c'est le classloader il gère, d'ailleurs je pense pas qu'il
charge 2 fois la meme classe si 2 threads veulent y accéder avant que le
chargement de la classe soit fini.



Donc le deuxieme thread attend que la classe soit completement chargée par
le premier avant de l'utilisé. Sans jouer sur les mots si ce n'est pas de la
synchronisation c'est quoi?


Donc la réponse est que pas besoin de synchroniser les blocs static,
c'est java qui s'en charge.


Avatar
Arnaud Berger
Le premier thread lui-même doit déjà attendre que la classe soit chargée.
De plus, la VM garantit qu'aucun thread ne peut essayer de faire joujou avec
une classe tant qu'elle n'est pas chargée, et que toute classe ne sera
chargée qu'une seule fois.

Quelques infos (mais en anglais) ici :
http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html#44
557

Cordialement,

Arnaud

"Bruno CAUSSE" a écrit dans le message news:
BEB12154.3C9A%
dans l'article 428b5224$0$24103$, Kupee à
a écrit le 18/05/05 16:33 :

Ben si c'est le classloader il gère, d'ailleurs je pense pas qu'il
charge 2 fois la meme classe si 2 threads veulent y accéder avant que le
chargement de la classe soit fini.


Donc le deuxieme thread attend que la classe soit completement chargée par
le premier avant de l'utilisé. Sans jouer sur les mots si ce n'est pas de
la

synchronisation c'est quoi?




1 2