ciao a tutti sto studiando la relazione di composizione di classi e ho dedotto questo: per evitare la rottura dell'incapsulamento passando riferimenti come parametri d'ingresso o di uscita dei metodi bisogna simulare i passaggi per valore. Ora mi sto esercitando ed ho ideato una classe Spesa che è una composizione di oggetti della classe Prodotto;il codice è questo
codice:
 public class Spesa {
    //attributi
    private ArrayList<Prodotto> ProdottiAcquistatati=new ArrayList<>(); //riferimento
    
    //costruttori
    public Spesa()
    {}
    public Spesa(ArrayList<Prodotto> s) //simulazione passaggio per valore
    {
        Iterator<Prodotto> iter=s.iterator();
        for(Prodotto p:s)
        {
          this.ProdottiAcquistatati.add(new Prodotto(iter.next().getPeso(),
                    iter.next().getPrezzoEtto(),iter.next().getScontoPercentuale()));
        }
    }
    // metodi
     public ArrayList<Prodotto> getSpesa() //simulazione passaggio per valore
     {
      ArrayList<Prodotto> s=new ArrayList<>();
      Iterator<Prodotto> iter=this.ProdottiAcquistatati.iterator();
      for(Prodotto p:this.ProdottiAcquistatati)
      {
          s.add(new Prodotto(iter.next().getPeso(),iter.next().getPrezzoEtto(),
                iter.next().getScontoPercentuale()));
      }
      return s;
     }
    public void setProdottiAcquistati(ArrayList<Prodotto> s)
    {
      this.ProdottiAcquistatati=s;
    }
dove la classe prodotto è la seguente:
codice:
public class Prodotto {
    //atributi
    private double Peso=0;//peso in kg
    private double PrezzoEtto=0; //prezzo all'etto
    private int ScontoPercentuale=0; //sconto in percentuale
    
    //costruttori
    public Prodotto()
    {}
    public Prodotto(double p,double pr,int s)
    {
        this.Peso=p;
        this.PrezzoEtto=pr;
        this.ScontoPercentuale=s;
    }
    
    //metodi
    public double getPeso()
    {
        return this.Peso;
    }
    public double getPrezzoEtto()
    {
        return this.PrezzoEtto;
    }
    public int getScontoPercentuale()
    {
        return this.ScontoPercentuale;
    }
    public void setPeso(float p)
    {
        this.Peso=p;
    }
    public void setPrezzoEtto(float pr)
    {
        this.PrezzoEtto=pr;
    }
    public void setScontoPercentuale(int s)
    {
        this.ScontoPercentuale=s;
    }
    @Override
    public String toString()
    {
        return "Peso: "+this.Peso+" Prezzo all'etto:"+this.PrezzoEtto+
                " Sconto in Percentuale: "+this.ScontoPercentuale;
    }
            
}
Ora volevo sapere se ho rispettato l'incapsulamento e quindi ho simulato bene il passaggio per valore. Grazie in anticipo per l'aiuto