Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

L'accès à la zone statique Piece.id doit se faire de manière statique

2 réponses
Avatar
kiddy
Salut à tous,

Je pose mon problème:

J'ai une classe Piece où il se trouve un attribut statique id,
que j'incremente à chaque création de piece (pour qu'une piece
soit unique).

Puis dans une classe ListePiece:
j'ai un Vector liste, qui me permet de ranger mes Pieces.
Comme chaque Piece est unique (grace à id), je voudrais donc renvoyer
la Piece correspondant à un id donné.
Pour cela je crée une methode:

public Piece getPiece(int i){
int j;
for(j=0;j<liste.size();j++){
if (i==((Piece)liste.elementAt(j)).id) {
return ((Piece)liste.elementAt(j));
}
}
return null;
}

et là j'ai drois à un joli message : L'accès à la zone statique
Piece.id doit se faire de manière statique.

Je comprend qu'il faut mettre ma methode getPiece en statique, et donc
crée un nouvel objet ListePiece dans cette methode.
Mais après j'ai un prob car il ne reconnait plus les methode size() et
elementAt()

Si vous avez une idée.

Merci de votre aide.

Kiddy

2 réponses

Avatar
Nicolas Repiquet
"kiddy" a écrit dans le message news:


Si vous avez une idée.


Tu es en train de te prendre la tête pour rien =)

class RoomManager {

private Map rooms = new TreeMap();
private int currentId = 0;

public Room newRoom() {
Room room = new Room( ++currentId );
rooms.put( new Integer(room.getId()), room );
return room;
}

public Room getRoom( int id ) {
return rooms.get( new Integer( id ));
}

public Collection getRooms() {
return Collections.unmodifiableCollection(rooms);
}

}

class Room {

private id;

// met le constructeur en protection "package"
// pour éviter qu'on puisse en construire une
// par inadvertence ailleurs que dans RoomManager.
// Si les classes friend existaient comme en c++
// ça serait parfois util.
Room( int id ) {
this.id = id;
}

public int getId() {
return id;
}

public String toString() {
return "Room " + id;
}
}



Donc ensuite, pour utiliser tout ça :


RoomManager roomManager = new RoomManager();

Room room1 = roomManager.newRoom();
Room room2 = roomManager.newRoom();

Room room = roomManager.getRoom( 1 );

Iterator i = roomManager.getRooms().iterator();

while( i.hasNext()) System.out.println(i.next());


Voilà. Ca doit être un design pattern mais je ne vois pas lequel.

-- Nicolas Repiquet

Avatar
Jc Sirot
kiddy wrote:
J'ai une classe Piece où il se trouve un attribut statique id,
que j'incremente à chaque création de piece (pour qu'une piece
soit unique).

Puis dans une classe ListePiece:
j'ai un Vector liste, qui me permet de ranger mes Pieces.
Comme chaque Piece est unique (grace à id), je voudrais donc renvoyer
la Piece correspondant à un id donné.
Pour cela je crée une methode:

public Piece getPiece(int i){
int j;
for(j=0;j<liste.size();j++){
if (i==((Piece)liste.elementAt(j)).id) {
return ((Piece)liste.elementAt(j));
}
}
return null;
}

et là j'ai drois à un joli message : L'accès à la zone statique
Piece.id doit se faire de manière statique.

Je comprend qu'il faut mettre ma methode getPiece en statique, et donc
crée un nouvel objet ListePiece dans cette methode.
Mais après j'ai un prob car il ne reconnait plus les methode size() et
elementAt()

Si vous avez une idée.

Merci de votre aide.

Kiddy


Tu n'as peut-être pas très bien compris comment fonctionne les variables
statiques. L'instance du champ id de ta classe Piece est partagé par
toutes les instances de la classe. Cela veut dire que dans ton cas id
est plus ou moins un compteur du nombre d'instances de Piece mais ne
permet pas d'identifier une instance de la classe. C'est pour cette
raison qu'il faut accéder à id de manière statique.

Un exemple :

Piece p1 = new Piece(...);
// Piece.id vaut 1;
Piece p2 = new Piece(...);
// Piece.id vaut 2;
System.out.println(p1.id); // ERREUR ; cela n'a pas de sens car id n'est
pas un membre de l'objet p1 mais de la classe Piece.

Pour donner un id unique aux instance de Piece, une solution élégante
consiste, par exemple, à créer un singleton PieceFactory avec un
compteur d'instance de Piece (cette fois statique) et une méthode
statique makePiece qui construit un objet Piece en initialisant son
champ id avec la valeur du compteur.

--

Cordialement
-- JC Sirot