Demande d'explication sur un problème java

Fermé
mathyass Messages postés 18 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 19 mai 2010 - 7 juil. 2008 à 22:17
 nerus - 13 juil. 2008 à 17:51
Tout d'abord bonjour à tous!

J'aimerai vous poser deux questions si quelqu'un pouvait m'éclairer:


Tout d'abord j'aimerai savoir si il est possible ou non d'appeller un vector encapsulé dans une classe dans un main et si oui comment

Voici ma classe qui crée le vector:



import java.util.*;
public class Queue {

private Vector <String> queue;


public Queue() {

queue = new Vector();

}

public synchronized void ecrit(String message) {

queue.add(message);
taille();
notify();
}

public synchronized String lit() {

boolean fini = false;
while (queue.isEmpty() && !fini)
try
{wait();}
catch (InterruptedException e1)
{System.out.println ("la file a été interrompue en lecture");
fini=true;
}

String message = queue.firstElement();
queue.remove(0);
taille();
return message;
}

public void taille(){

System.out.println ("il y a " + queue.size() + "éléments dans la liste");

}


}



Et j'aimerai appeller un vector de type queue dans un main mais je n'y arrive pas? ( en fait utiliser les taches qui agissent sur queue )
Cela est-il possible ou est-ce tout simplement pas nécessaire grace aux autres classe?


exemple de classe qui utilise queue:


public class Producteur extends Thread {


private int numero;
private String message;
private long intervale;
private Queue queue;


public Producteur (int numero, String message, long intervalle, Queue queue){

this.numero = numero;
this.message=message;
this.intervale=intervale;
this.queue=queue;

}


public void run(){

boolean fini = false;
while(!fini){

try
{
sleep(this.intervale);

}
catch (InterruptedException e1)
{
System.out.println ("le producteur " + numero + "a été interompu");
fini=true;
}



if(!fini)
{
queue.ecrit(message);
System.out.println ("le producteur" + numero + "a écrit un message" + message + "dans la file");

}

}

}
}






Et ensuite j'ai une classe d'un programme fonctionnel et j'aimerai un éclaircissement:


voici la classe :

import java.io.Serializable;


public class Monnaie implements Serializable {
/**
*
*/
private static final long serialVersionUID = 5292042252928489543L;

String name;
float taux;

public Monnaie() {
this.name = "";
this.taux = (float)0.0;
}

public Monnaie( String nom, float t ) {
this.name = nom;
this.taux = t;
}
}


(L'objet monnaie est utilisé dans une communication client serveur sur un base de donnée oracle)


J'aimerai savoir pourquoi Monnaie est construit deux fois , l'intéret de faire ceci.

(je peux donner les autres classes client serveur si cela est nécessaire)


Merci d'avance
A voir également:

12 réponses

X-Fan Messages postés 805 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 6 janvier 2010 24
7 juil. 2008 à 23:26
Ton objet Vector <String> queue; est private (puisque tu l'as déclaré comme tel).
Pour le récupérer, tu dois créer une classe du genre:

public queue getvector(){
return queue;
}

Assure toi donc que l'objet dans quoi tu vas le mettre sera aussi un vecteur ;)


Pour ton deuxième cas, comme tu peux le voir, le nom de ta class est "Monnaie" et le nom des deux méthodes nommées est "Monnaie". Lorsqu'une méthode porte le même nom que sa classe, elle est appelée un constructeur. Ma parole, tu n'as pas appris les bases du java toi. :P

Lorsque tu fais:
Monnaie m = new Monnaie();
La méthode appelée dans ta classe "Monnaie" sera "Monnaie" (donc ton constructeur).

En programmation objet il a la notion de polymorphisme. Un exemple de polymorphisme est la "surcharge" c'est-à-dire le fait de donner plusieurs fois le même nom à plusieurs méthodes différentes dans une même classe mais en leur spécifiant des paramètres différents.

Donc ton polymorphisme c'est ici la surcharge de ta méthode Monnaie. Ta première méthode ne prend aucun paramètre et la deuxième prend un string et un float. Donc pour construire un objet de cette classe, tu as deux façons:
1- Monnaie m = new Monnaie(); //appellera ta première méthode
2- Monnaie m = new Monnaie("salut",0.1); //appellera ta deuxième méthode

Et comme tu peux le voir, dans ton cas, le but d'avoir deux fois cette méthode est bien simple. La première méthode est utilisée lorsque l'utilisateur ne spécifie aucun paramètre (on donne donc des valeurs par défaut qui sont "" pour le name et 0.0 pour le taux). La deuxième est utilisée dans le cas où l'utilisateur a entré deux paramètres et donc name prendra la valeur donnée en paramètre et taux de même).
0
mathyass Messages postés 18 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 19 mai 2010 2
8 juil. 2008 à 09:38
Bonjour X fan

Merci pour tes explications.

Déjà pour ma 2eme question , je sais qu'une méthode de même nom que la classe est un constructeur mais je ne voyais pas l'utilité du polymorphisme donc merci à toi.


Pour ma première question en fait ma classe Queue existe déjà ainsi que ses méthodes comme tu l'as vu. J'ai peut être mal formulé ma question je ne voulais pas récupérer par un return mais en fait une instance queue de Queue pour travailler dessus avec Produceur par exemple.
Mais l'appel de type Queue queue = new Queue(); ne semble pas fonctionner. Comprends-tu ma question?


Merci beaucoup à toi en tous cas

Math
0
Bonjour mathyass,

première chose, il me semble, si j'ai bien compris que ce que tu souhaites faire avec Vector c'est une Pile!!! donc je te conseillerai d'utiliser la classe Stack plutot que Vector!!! Elle possède les méthodes dont tu as besoin! push et pop!!!

Pour ton problème d'appel de ta classe Queue dans un main, verifie que ta variable est soit locale :
public static void main(String[] args)
{
Queue q = new Queue();
}

s'il s'agit d'un attribut de ta classe, vérifie qu'il soit bien static!!

private static Queue q;
public static void main(String[] args)
{
q = new Queue();
}

j'espère avoir répondu à ta question!
0
X-Fan Messages postés 805 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 6 janvier 2010 24
8 juil. 2008 à 16:36
Perso, j'ai presque toujours utilisé celle là:
public static void main(String[] args)
{
Queue q = new Queue();
}

Et cela fonctionne toujours. Donc je ne vois pas pourquoi dans ton cas elle ne fonctionnerait pas.


EDIT:
public Queue() {

queue = new Vector();

}

1- Tu n'es pas obligé de mettre public en avant de Queue car c'est un constructeur.
2- essaie de mettre: this.queue à la place de queue tout seul. ;)
0
mathyass Messages postés 18 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 19 mai 2010 2
9 juil. 2008 à 11:07
Merci à vous j'ai réussi à régler mon soucis en utilisant Queue q = new Queue(); que j'avais mal utilisé.
Par contre après j'ai eu un soucis avec un string utilisé comme paramètre dans une classe à part





private int numero;
private String message;
private long intervale;
private Queue queue;


public Producteur (int numero, String message, long intervalle, Queue queue){

this.numero = numero;
this.message=message;
this.intervale=intervale;
this.queue=queue;

}



Pour entrer le paramètre message quand j'appel un producteur dans ma méthode main :
Producteur p1 = new Producteur(1,mess,1000,queue1);

J'ai eut une erreur sur le mess: tout d'abord je ne l'avais pas déclaré (dans ma classe main)
public String mess = "message test";
ensuite le programme me demandai de le passer en static public static String mess = "message test"; ce qui a fonctionné.
D'où une question que je me pose: quand on entre un parametre int (dans un appel d'une instance dans la méthode main) on a nul besoin de le déclarer mais un string oui il a une raison? (désolé si ma question est bête mais je m'y met en essayant de bien comprendre )






Et une autre petite question o passage.
Si j'écrit par exemple Boolean test = false;

while (!test) j'ai un doute avec cette condition quelqu'un peut il me dire clairement? car j'hésite avec tant que test est false => !test est true donc on reste dans la boucle mais je ne suis pas certain.



Merci à vous tous pour votre aide :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mathyass Messages postés 18 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 19 mai 2010 2
9 juil. 2008 à 11:47
Oups j'ai écrit une bétise et je peux pas éditer
Mais c'est bon pour mon histoire de static j'ai juste oublié de mettre les "" dans la déclaration :
Producteur p1 = new Producteur(1,"mess",1000,queue1); honte à moi lol je m'excuse

Par contre pour le ! je veux bien vos eclaircissement ^^

Mathyass
0
X-Fan Messages postés 805 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 6 janvier 2010 24
9 juil. 2008 à 15:34
Boolean test = false;

while (!test)
{
blablabla...
}

Cela veut dire, tant que différent de test. Mais je suppose que comme il n'y a pas d'élément de comparaison, soit c'est une boucle infinie soit ça ne passe pas dedans (essaie avec le débugger).
Je sais que while (test) est infini mais j'ai jamais essayé avec un ! devant mais peut-être que ce sera le même résultat (vu que rien a comparé donne toujours vrai).

Fait un test en mettant un System.out.println("salut"); et regarde si ça affiche.
0
mathyass Messages postés 18 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 19 mai 2010 2
10 juil. 2008 à 10:05
Bon il semblerait que ce soit une boucle infinie à part si la tache est interrompue merci :)
0
samalairbien
12 juil. 2008 à 14:58
Ta boucle while(!test) n'est pas forcément infinie (et c'est à souhaiter qu'elle ne le soit pas!).

Puisque tu as initialié le booléen test à false, au premier passage, le sens de cette instruction est "si on test est à vrai, je rentre dans la boucle". Si tu ne modifies jamais test dans ton corps de boucle, effectivement cela devient une boucle infinie.

Mais le but de cette construction est de dire, à un moment dans le corps de la boucle, test=true, de sorte que le prochain test "while(!test)" soit à faux et qu'on sorte de la boucle (est-ce que non-test est à vrai? non puisque test est à vrai).
0
mathyass Messages postés 18 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 19 mai 2010 2
10 juil. 2008 à 16:49
Re à tous,


Bon j'ai encore des eclaircissements à vous demander mais comme j'ai commencé un topic je pense continuer dessus à part si un modérateur y vois un inconvénient.

Donc voilà c'est au sujet d'un programme de type: client serveur base de données oracle

Voici l'interface :

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.ArrayList;



public interface Connex extends Remote {

ArrayList<Monnaie> afficher() throws RemoteException;
int ajoute(Monnaie monnaie) throws RemoteException;
int modifier(Monnaie monnaie) throws RemoteException;
int supprimer(Monnaie monnaie) throws RemoteException;
}


Voici la classe Monnaie :

import java.io.Serializable;


public class Monnaie implements Serializable {
/**
*
*/
private static final long serialVersionUID = 5292042252928489543L;

String name;
float taux;

public Monnaie() {
this.name = "";
this.taux = (float)0.0;
}

public Monnaie( String nom, float t ) {
this.name = nom;
this.taux = t;
}
}


et le début de la classe client :

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.rmi.*;
import java.util.ArrayList;

public class ConnexClient {


private static void afficher( Connex connect ) {
ArrayList<Monnaie> result;
try {
result = connect.afficher();

for( Monnaie monnaie : result) {
System.out.println("Devise: "+monnaie.name+"\tValeur: "+monnaie.taux);
}
} catch (RemoteException e) {
e.printStackTrace();
}
}



Ici la méthode afficher renvoi le résultat de la méthode connect.afficher() de l'interface implémentée par le serveur (car la méthode executeQuery de jdbc retourne un ResultSet qui n'est pas sérialisable et ne peut donc pas être renvoyé directement via un RMI et il faut donc recopier les données du ResultSet dans une collection de données sérialisable) mais je ne comprend pas la condition for( Monnaie monnaie : result)...?



De plus voici l'implémentation sur le serveur:


public synchronized ArrayList<Monnaie> afficher() throws RemoteException {
ArrayList<Monnaie> monnaies = new ArrayList<Monnaie>();

try {
System.out.println(InetAddress.getByName(getClientHost()).getHostName() + " affiche");
String requete = "SELECT * FROM monnaie";
System.out.println("requete: "+requete);
ResultSet result = stmt.executeQuery(requete);

while( result.next() ) {
monnaies.add(new Monnaie(result.getString(1),Float.parseFloat(result.getString(2))));
}
return monnaies;


} catch (Exception e) {
e.printStackTrace();
return null;
}
}




Ici je ne comprend pas : monnaie (dans la commande SELECT * monnaie) représente quoi ici?? (ce n'est pas monnaies créée ni le type d'objet Monnaie). De plus monnaies va donc contenir tous les résultats que result va parcourir mais comment la méthode du client parcours monnaies pour les afficher?


Mon post est lourd et j'ai posé pas mal de questions je suis désolé mais j'aimerai bien comprendre.
Si vous avez des questions complémentaires avant de me répondre n'hésitez pas.



Merci d'avance :)


Mathyass
0
X-Fan Messages postés 805 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 6 janvier 2010 24
10 juil. 2008 à 19:09
Ben tu dois avoir une table "monnaie" dans ta base de données.

Result contiendra toutes les lignes de ta base de données pour la table "monnaie" et le while( result.next() ) lit en fait toutes les lignes une à une jusqu'à qu'il arrive à la fin (les lignes récupérées grâce à la requête).
Dans ce while, il récupère donc les infos de chaque ligne de ta table "monnaie" et il les met dans un array (un tableau quoi).

Et puis pour l'affichage, il y a un
for( Monnaie monnaie : result) {
System.out.println("Devise: "+monnaie.name+"\tValeur: "+monnaie.taux);
}

C'est dans cette boucle qu'il fait l'affichage.
0
mathyass Messages postés 18 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 19 mai 2010 2
10 juil. 2008 à 20:55
Ok merci par contre j'avais compris pour la boucle d'affichage mais c'est la condition for( Monnaie monnaie : result) que je ne comprend pas...
0
X-Fan Messages postés 805 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 6 janvier 2010 24
10 juil. 2008 à 21:03
Désolé je n'ai jamais vu ça et je n'ai jamais fait de java avec des bases de données en même temps. J'ai fait les deux mais c'était séparé et je ne connais que SQL et pas Oracle.

Donc je pourrais pas te dire. ;)
0
mathyass Messages postés 18 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 19 mai 2010 2
12 juil. 2008 à 12:28
Arf pas grave Xfan


Qulequ'un peut m'aider?
0
mathyass Messages postés 18 Date d'inscription mercredi 27 septembre 2006 Statut Membre Dernière intervention 19 mai 2010 2
12 juil. 2008 à 15:14
Bon j'ai trouvé c'est une maniere particulère de faire les boucles mais j préfère avec les itérateurs et la syntaxe normale merci à tous
0
bonjour,

List<Monnaie> lst = new ArrayList<Monnaie>();
for(Monnaie m : lst){
...
}

en fait, c'est une manière d'écrire les boucles for que je trouve, personnellement, beaucoup plus sympa!
C'est disponible depuis java 5, ça ressemble à la méthode foreach dans d'autres langage et en fait je trouve ça beaucoup plus facile à traduire en langage humain!! la boucle pour chaque m de type Monnaie dans lst

en fait, c'est la meme chose que :
for(int i =0; i<lst.size();i++){
Monnaie m = lst.get(i);
}

avoue que c'est beaucoup plus simple à écrire!!!

dernière chose
pour ta boucle while, je pense que dans ton cas, tu cherches à utiliser le type boolean (minuscule) et pas la classe Boolean donc déclare boolean test, ce sera mieux je pense!!

à plus
0