L'accès à la zone statique Piece.id doit se faire de manière statique
2 réponses
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()
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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; }
Voilà. Ca doit être un design pattern mais je ne vois pas lequel.
-- Nicolas Repiquet
"kiddy" <leo.kiddy@laposte.net> a écrit dans le message news:
GFr.1a046a8a8bf64ea4989682@news.libertysurf.fr...
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;
}
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; }
Voilà. Ca doit être un design pattern mais je ne vois pas lequel.
-- Nicolas Repiquet
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
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.
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.