Exercice simple en java [Résolu/Fermé]

Signaler
Messages postés
15
Date d'inscription
dimanche 20 juillet 2014
Statut
Membre
Dernière intervention
3 mars 2015
-
anaanonyme
Messages postés
15
Date d'inscription
dimanche 20 juillet 2014
Statut
Membre
Dernière intervention
3 mars 2015
-
Bonjour j'ai un petit problème dans un code java très simple

j'ai une classe Article pour représenter les articles vendus dans un supermarché;

et je veux lors de la création d'un nouveau article vérifier si il y a un autre article avec la même référence

car c'est elle qui caractérise l'article de manière unique

voila le code j'espère qu'il est visible
public class Article {
 
    private long reference;
    private String intitule;
    private float prixHT;
    private int quantiteEnStock;
     
    public Article(long reference,String intitule,float prixHT,int quantiteEnStock){
         
        setReference(reference);
        setIntitule(intitule);
        setPrixHT(prixHT);
        setQuantiteEnStock(quantiteEnStock);
    }
 
    public String getIntitule() {
        return intitule;
    }
 
    public void setIntitule(String intitule) {
        this.intitule = intitule;
    }
 
    public long getReference() {
        return reference;
    }
 
    public void setReference(long reference) {
        this.reference = reference;
    }
 
    public float getPrixHT() {
        return prixHT;
    }
 
    public void setPrixHT(float prixHT) {
        this.prixHT = prixHT;
    }
 
    public int getQuantiteEnStock() {
        return quantiteEnStock;
    }
 
    public void setQuantiteEnStock(int quantiteEnStock) {
        this.quantiteEnStock = quantiteEnStock;
    }
     
    public void approvisionner(int nombreUnites){
        setQuantiteEnStock(nombreUnites+getQuantiteEnStock());
    }
    public boolean vendre(int nombreUnites)
    {
        if(nombreUnites<getQuantiteEnStock())
        {
        setQuantiteEnStock(getQuantiteEnStock()-nombreUnites);
        return true;
        }  
        else
        return false;
    }
    public float prixHT(){
        return getPrixHT();
    }
    public float prixTTC(){
        return (1+ (float)0.196)*getPrixHT();
        
    }
    public String toString ()
    {
        return(" l'article num:"+getReference()+" "+getIntitule()+" "+getPrixHT()+" et le quantite en stock est :"+getQuantiteEnStock());
        
    }
    public boolean equals(Article unArticle)
    {
        if(unArticle.getReference()==getReference())
            {System.out.println("true");
            return true;}
            else
                System.out.println("false");
                return false;
    }
public static void main(String[] args) {
         
Article[] articles;
articles=new Article[10];
articles [1]=new Article(1,"intitu",10,100);
articles [2]=new Article(2,"intitu2",20,200);
articles [3]=new Article(3,"intitu3",30,300);
articles [4]=new Article(4,"intitu4",40,400);
 
//articles[1].equals(articles[2]);
articles[1].approvisionner(10);
 
articles[1].vendre(100);
//System.out.println(articles[1]);
//articles[1].prixTTC();
System.out.println (articles[2].prixTTC());
for(int i=1;i<4;i++){
    System.out.println (articles[i]);  
}
}
}

2 réponses

Messages postés
16116
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 février 2020
2 539
Bonjour,

Et quel est ton problème ? Ta question ?
Messages postés
15
Date d'inscription
dimanche 20 juillet 2014
Statut
Membre
Dernière intervention
3 mars 2015

Salut,merci pour votre réponse;
le problème c'est que je peux créer deux objets avec la même référence tandis que chaque article a sa propre référence.
comment puis-je indiquer au constructeur que si la référence existe déjà il ne doit pas créer l'objet?
KX
Messages postés
16116
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 février 2020
2 539
Basiquement de deux manières :

1) la référence est gérée directement par la classe, via un compteur static auto-incrémenté par exemple.

private final long reference;
private static nextReference = 1;

public Article(String intitule,float prixHT,int quantiteEnStock){
    reference = nextReference++;
    setIntitule(intitule);
    setPrixHT(prixHT);
    setQuantiteEnStock(quantiteEnStock);
}

Remarque : dans ce cas il faut supprimer la méthode setReference, car si tu autorises à la modifier tu n'as plus de garantie quant à son unicité.

2) tu enregistres toutes les références déjà utilisées et tu lèves une exception lorsque tu veux modifier une référence par une valeur déjà prise.

private static Set<Long> allReferences = new TreeSet<Long>();

public void setReference(long reference) throws IllegalArgumentException {
    if (allReferences.contains(reference))
        throw new IllegalArgumentException("reference already used: "+reference);

    allReferences.remove(this.reference);
    allReferences.add(reference);

    this.reference = reference;
}

Remarque : aucun de ces deux codes n'est thread-safe,
anaanonyme
Messages postés
15
Date d'inscription
dimanche 20 juillet 2014
Statut
Membre
Dernière intervention
3 mars 2015
> KX
Messages postés
16116
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 février 2020

Merci beaucoup pour votre temps :)
la première méthode marche très bien mais pour la deuxième j'ai compris l'idée mais pas le code(TreeSet,< >...),mais je vais chercher merci beaucoup