OVH Cloud OVH Cloud

Instance unique ?

9 réponses
Avatar
acc
Bonjour,

Je me demande comment faire pour avoir une instance unique d'une classe.
C'est à dire que si dans une methode quelconque je fais par exemple :

[...]
MaClasseUnique mcu = new MaClasseUnique() ;
[...]

le new me renverrais une instance déjà existente si elle existe ou la créer
sinon.
Le but est d'avoir une classe maitresse mais je ne sais pas comment faire.

Merci pour votre aide.

Stéphane.

9 réponses

Avatar
Frederic WOEHL
public class Singleton {
static private Singleton _instance = null;
private Singleton() {
// ...
}
static public Singleton instance() {
if(null == _instance) {
_instance = new Singleton();
}
return _instance;
}
}

acc wrote:

Bonjour,

Je me demande comment faire pour avoir une instance unique d'une classe.
C'est à dire que si dans une methode quelconque je fais par exemple :

[...]
MaClasseUnique mcu = new MaClasseUnique() ;
[...]

le new me renverrais une instance déjà existente si elle existe ou la créer
sinon.
Le but est d'avoir une classe maitresse mais je ne sais pas comment faire.

Merci pour votre aide.

Stéphane.


Avatar
Nicolas Repiquet
"acc" a écrit dans le message news:
3fa27c4a$0$243$
Bonjour,

Je me demande comment faire pour avoir une instance unique d'une classe.
C'est à dire que si dans une methode quelconque je fais par exemple :

[...]
MaClasseUnique mcu = new MaClasseUnique() ;
[...]

le new me renverrais une instance déjà existente si elle existe ou la
créer

sinon.
Le but est d'avoir une classe maitresse mais je ne sais pas comment faire.

Merci pour votre aide.

Stéphane.


C'est un design pattern du nom de "Singleton". Tu ne peux pas le faire en
java en utilisant l'opérateur new, mais par contre tu peux contourner ceci
en passant par une méthode statique :

class Singleton {

static private Singleton instance = new Singleton();
static public Singleton getInstance() { return instance; };
private Singleton() {}
}

maintenant tu es obligé de passer par getInstance() pour récupérer une
instance de Singleton, et c'est toujours la même.

Ca serait largement suffisant si ce comportement était héritable, hélas ce
n'est pas le cas ... mais on fait ce qu'on peut avec ce qu'on a.

-- Nicolas Repiquet

Avatar
Nicolas Delsaux
Le Fri, 31 Oct 2003 17:37:24 +0100, acc s'est levé est s'est dit : "tiens,
si j'écrivais aux mecs de fr.comp.lang.java :

Merci à tous les deux, j'ai compris !

Encore deux petites précisions;
Quelle est la portée de cette unicité au niveau du sytème hôte ?.


Un singleton est unique dans un ClassLoader donné (une sombre histoire de
namespace). Mais en général c'est alrgement suffisant pour les besoins.

Quand tu dis que ce comportement n'est pas héritable, est-ce à dire qu'on ne
peut pas étendre la classe Singleton ?


Le constructeur unique étant private, oui. Par contre, si tu passes le
constructeur en protected, tu peux surcharger ton singleton, mais ça risque
d'être très dangereux, à moins que ta classe dérivée ne soit elle aussi un
singleton, ce qui est un peu plus dur à implémenter.

Stéphane.



--
Nicolas Delsaux
"Etre un humain était bien, j'y ai même pris du plaisir. Mais être un
cyborg a tellement plus à offrir"
Kevin Warwick

Avatar
acc
"Nicolas Repiquet" a écrit dans le message de
news: 3fa27f6b$0$27041$

"acc" a écrit dans le message news:
3fa27c4a$0$243$
Bonjour,

Je me demande comment faire pour avoir une instance unique d'une classe.
C'est à dire que si dans une methode quelconque je fais par exemple :

[...]
MaClasseUnique mcu = new MaClasseUnique() ;
[...]

le new me renverrais une instance déjà existente si elle existe ou la
créer

sinon.
Le but est d'avoir une classe maitresse mais je ne sais pas comment
faire.



Merci pour votre aide.

Stéphane.


C'est un design pattern du nom de "Singleton". Tu ne peux pas le faire en
java en utilisant l'opérateur new, mais par contre tu peux contourner ceci
en passant par une méthode statique :

class Singleton {

static private Singleton instance = new Singleton();
static public Singleton getInstance() { return instance; };
private Singleton() {}
}

maintenant tu es obligé de passer par getInstance() pour récupérer une
instance de Singleton, et c'est toujours la même.

Ca serait largement suffisant si ce comportement était héritable, hélas ce
n'est pas le cas ... mais on fait ce qu'on peut avec ce qu'on a.

-- Nicolas Repiquet


Merci à tous les deux, j'ai compris !


Encore deux petites précisions;
Quelle est la portée de cette unicité au niveau du sytème hôte ?.
Quand tu dis que ce comportement n'est pas héritable, est-ce à dire qu'on ne
peut pas étendre la classe Singleton ?

Stéphane.


Avatar
Patrick Gras
"Frederic WOEHL" wrote in message
news:
public class Singleton {
static private Singleton _instance = null;
private Singleton() {
// ...
}
static public Singleton instance() {
if(null == _instance) {
_instance = new Singleton();
}
return _instance;
}
}

acc wrote:

[...]



Avec un peu de malchance (plusieurs threads qui accèdent en même temps à
Singleton.instance()) tu auras plusieurs objets Singleton différents...

-Patrick


Avatar
Patrick Gras
"Nicolas Delsaux" wrote in message
news:1ki4rk5r360u6$.1dzfq2uhot7fr$
Le Fri, 31 Oct 2003 17:37:24 +0100, acc s'est levé est s'est dit : "tiens,
si j'écrivais aux mecs de fr.comp.lang.java :

Merci à tous les deux, j'ai compris !

Encore deux petites précisions;
Quelle est la portée de cette unicité au niveau du sytème hôte ?.


Un singleton est unique dans un ClassLoader donné (une sombre histoire de
namespace). Mais en général c'est alrgement suffisant pour les besoins.

Quand tu dis que ce comportement n'est pas héritable, est-ce à dire
qu'on ne


peut pas étendre la classe Singleton ?


Le constructeur unique étant private, oui. Par contre, si tu passes le
constructeur en protected, tu peux surcharger ton singleton, mais ça
risque

d'être très dangereux, à moins que ta classe dérivée ne soit elle aussi un
singleton, ce qui est un peu plus dur à implémenter.

Stéphane.



--
Nicolas Delsaux
"Etre un humain était bien, j'y ai même pris du plaisir. Mais être un
cyborg a tellement plus à offrir"
Kevin Warwick


Hello,

il y plein de "problèmes" liés aux différentes implémentations du pattern
Singleton, tu peux trouver pas mal d'infos sur www.javaworld.com en tapant
Singleton dans le moteur de recherche...

-Patrick


Avatar
vclassine
Nicolas Delsaux wrote in message news:<1ki4rk5r360u6$.1dzfq2uhot7fr$...
Le Fri, 31 Oct 2003 17:37:24 +0100, acc s'est levé est s'est dit : "tiens,
si j'écrivais aux mecs de fr.comp.lang.java :

Merci à tous les deux, j'ai compris !

Encore deux petites précisions;
Quelle est la portée de cette unicité au niveau du sytème hôte ?.


Un singleton est unique dans un ClassLoader donné (une sombre histoire de
namespace). Mais en général c'est alrgement suffisant pour les besoins.


Ce qui concrètement s'apparente souvent à une portée programme. Sauf
cas tordus ça s'applique à tout ce qui à été lancé par la même
commande java (java, javaw). Pour les applets je ne sais pas trop.

Une idée pour augmenter la portée serait d'utiliser un mécanisme sur
socket ou via RMI...


Avatar
Cédric Chabanois
Patrick Gras wrote:

"Frederic WOEHL" wrote in message
news:

public class Singleton {
static private Singleton _instance = null;
private Singleton() {
// ...
}
static public Singleton instance() {
if(null == _instance) {
_instance = new Singleton();
}
return _instance;
}
}

acc wrote:


[...]




Avec un peu de malchance (plusieurs threads qui accèdent en même temps à
Singleton.instance()) tu auras plusieurs objets Singleton différents...

-Patrick


Oui, il faut faire gaffe et utiliser une synchronisation si le singleton
peut être appelé à partir de plusieurs threads !

Cédric



Avatar
cilovie
voir
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

"Cédric Chabanois" a écrit dans le message de news:
3fa68cb9$0$239$
Patrick Gras wrote:

"Frederic WOEHL" wrote in message
news:

public class Singleton {
static private Singleton _instance = null;
private Singleton() {
// ...
}
static public Singleton instance() {
if(null == _instance) {
_instance = new Singleton();
}
return _instance;
}
}

acc wrote:


[...]




Avec un peu de malchance (plusieurs threads qui accèdent en même temps à
Singleton.instance()) tu auras plusieurs objets Singleton différents...

-Patrick


Oui, il faut faire gaffe et utiliser une synchronisation si le singleton
peut être appelé à partir de plusieurs threads !

Cédric