Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    Per voi è corretta questa mia semplice classe?

    Ciao,
    a brevissimo avrò un esame che contiene anche JAVA (esame base...niente eccezioni, enumerazioni, etcetc)

    L'esercizio dice:
    roblema 1. Si richiede il progetto di una classe JAVA per rappresentre il tipo ArticoloInSupermercato che rappresenta e gestisce gli articoli in vendita in un supermercato. Ciascun articolo deve recare le informazioni relative al suo nome, al suo prezzo ed alla quantità presente nel negozio. Inoltre, ciascun articolo deve registrare anche il reparto del supermercato cui è assegnato (ad esempio, ortofrutta, macelleria, pulizia casa, ….).

    I reparti caratterizzano completamente il supermercato e devono essere noti prima che la gestione degli articoli possa iniziare. Si osservi come, al momento della creazione di un oggetto di tipo , sia necessario controllare che esso appartenga ad un reparto presente nel supermercato.
    Le operazioni richieste per il tipo di dato sono:
    a) accesso (in lettura) alle caratteristiche di un oggetto;
    b) test di uguaglianza di due oggetti;
    c) rappresentazione di un oggetto in forma di stringa.


    va bene questa classe Java che ho scritto? (poi avrei un problemino a ridefinire il metodo equals...se qualcuno mi dà una mano gliene sono grato.

    codice:
    public class ArticoloInSupermercato{
    	
    	private static String [] reparti = null;	// Array di stringhe di classe: rappresenta i reparti del supermercato
    	
    	private String nome_Articolo;  				// Nome dell'articolo in vendita, inizialmente a ull
    	private double prezzo_Articolo;		  		// Prezzo dell'articolo in vendita
    	private int quantita_Articolo;	      		// Numero di oggetti in vendita per un certo articolo
    	private int indice_Reparto;           		// Indice di identificazione del reparto nell'array di classe reparti
    	
    	/** METODO DI CLASSE Inizializza(): inizializza il vettore di classe di stringhe reparti con i nomi dei reparti presenti
    	    nel supermercato.
    	    @param un vettore di stringhe che contiene i nomi dei reparti del supermercato
    	    @return void */
    	   
    	public static void Inizializza(String [] T){
    		
    		int i;
    		if(reparti == null){			// Se la classe non è stata ancora inizializzata
    			for(i=0; i<T.length; i++)
    				reparti[i] = T[i];		// Copia i riferimenti alle stringhe del vettore parametro T nel vettore reparti
    		}
    			
    		else System.err.println("ERRORE: La classe ArticoloInSupermercato è già stata inizializzata");
    	}
    	
    	/** COSTRUTTORE: Inizializza tutte le variabili di istanza e crea un nuovo oggetto istanza della classe.
    	    @param nome di tipo String
    	    @param prezzo di tipo double
    	    @param quantita di tipo int
    	    @param indice di tipo int
    	    @return il riferimento ad un oggetto di tipo ArticoloInSupermercato */
    	    
    	public ArticoloInSupermercato(String nome, double prezzo, int quantita, int indice){
    		
    		if(reparti != null){   // Se la classe è già stata inizializzata crea l'oggetto ed inizializza le sue variabili di istanza
    			nome_Articolo = nome;			// Metti il riferimento della stringa nome in nome_Articolo
    			prezzo_Articolo = prezzo;		// Copia il valore double di prezzo in prezzo_Articolo
    			quantita_Articolo = quantita;   // Copia il valore int di quantita in quantita_Articolo
    			indice_Reparto = indice; 		// Copia il valore int di indice in indice_Reparto
    		}
    		
    		else					// Altrimenti restituisci un messaqggio di errore e non fare nulla
    			System.err.println("ERRORE: la classe non è stata ancora inizializzata, impossibile creare l'oggetto");
    	}
    	
    	/* METODI DI ACCESSO AI DATI: */
    	
    	/** getNome: restituisce al chiamante il valore contenuto nel campo nome dell'oggetto ricevente
    		@param void
    		@return una stringa contenente il nome del prodotto */
    		
    	public String getNome(){
    		return nome_Articolo;		// Ritorna al chiamante il riferimento alla stringa contenente il nome dell'articolo
    	}
    	
    	/** getPrezzo: restituisce al chiamante il valore contenuto nel campo prezzo dell'oggetto ricevente
    		@param void
    		@return una double contenente il prezzo del prodotto */
    		
    	public double getPrezzo(){
    		return prezzo_Articolo;		// Ritorna al chiamante il riferimento alla stringa contenente il nome dell'articolo
    	}
    	
    	/** getQuantita: restituisce al chiamante il valore contenuto nel campo prezzo quantita dell'articolo
    		@param void
    		@return un int contenente il numero di prodotti per uno specifico articolo */
    		
    	public int getQuantita(){
    		return quantita_Articolo;
    	}
    	
    	/** getRepartp: restituisce al chiamante il valore rappresentante l'indice nell'array dei reparti del supermercato
    		@param void
    		@return un int che rappresenta l'indice nell'array dei reparti del supermercato */
    	
    	public int getReparto(){
    		return indice_Reparto;
    	}
    	
    	
    	/* METODI DI UTILITA' */
    	
    	/** METODO toSting: Restituisce al chiamante una stringa contenente i dati contenuti nelle variabili di istanza di un
    	    oggetto.
    	    @param void
    	    @return un oggetto di tipo String che contiene i dati delle variabili di istanza dell'oggetto ricevente sotto forma
    	    di stringa */
    	    
    	public String toString(){
    		
    		String Risposta = "Il nome dell'articolo è: " + nome_Articolo + "Il prezzo è: " + prezzo_Articolo + "Nel supermercato ci sono tot pezzi: " + quantita_Articolo + "L'articolo appartiene al reparto: " + reparti[indice_Reparto];
        	return Risposta;
    	}
    	
    	/** METODO EQUALS: ridefinisco il metodo equals per confrontare due oggetti istanza della classe ArticoliInSupermercato
    		@parm prodotto di tipo ArticoloInSupermercato da confrontare con l'oggetto ricevente il messaggio
    		@return esito di tipo boolean: TRUE se i due oggetti sono uguali, FALSE altrimenti.
    	
    	public boolean equals(ArticoloInSupermercato prodotto){
    		
    		boolean esito = this.nome_Articolo == prodotto.getNome */
    		
    }
    Così come l'ho fatta può essere considerata logicamente corretta?
    ho qualche dubbio sul fatto che avendo dichiarato la variabile nome_Articolo come String possano succedere casini ad esempio con il metodo getNome che ritorna al chiamante il riferimento a quella stringa...in teoria non credo che sia un problema in quanto le stringhe dovrebbero essere oggetti immutabili (nel senso che se provo a modificarlo non si modifica quella stringa ma se ne crea un'altra) quindi non dvorebbe fare problemi...

    Il problema a scrivere il metodo equals() (che mi dovrebbe confrontare l'oggetto ricevente con l'oggetto referenziato dal parametro) sempre per quanto concerne le stringhe...come faccio a confrontare 2 stringhe?
    se in tale metodo faccio:
    this.nome_Articolo = Prodotto.nome_Articolo non stò semplicemente confrontando dei riferimenti a stringhe (e non le stringhe vere e proprie)...come posso implementarlo?

    C'è qualche problema di sicurezza nella mia classe?

    Per favore...l'esame si avvicina sempre più...

    Tnx
    Andrea

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    157
    Come da API, per confrontare due stringhe si usa il metodo equals

    codice:
    s1.equals(s2);
    questo per un match case-sensitive. Per uno case-unsensitive, usa questo

    codice:
    s1.equalsIgnoreCase(s2);

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    Originariamente inviato da alde90
    Come da API, per confrontare due stringhe si usa il metodo equals

    codice:
    s1.equals(s2);
    questo per un match case-sensitive. Per uno case-unsensitive, usa questo

    codice:
    s1.equalsIgnoreCase(s2);
    ti ringrazio...e sai dirmi se il mio codice è considerabile "buono" e sicuro? (la pippa mentale sulle stringhe...)....insomma me lo avrebbe passato per buono all'esame?

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    157
    ti dico che io studio ancora alle superiori, quindi non ti saprei dire però mi sembra corretto, per quanto riguarda le stringhe sì, effettivamente viene copiato il riferimento, ma non si può modificare una stringa. Ogni volta che viene creata una stringa, questa resta così fino alla sua distruzione (non avendo accesso diretto al vettore). E in più s = s+" "; è una stringa che usa lo stesso puntatore, però l'oggetto è diverso (ergo, la "vecchia" stringa s è rimasta in memoria e ne è stata creata una "nuova" con il valore precedente più uno spazio)

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    1) Ti hanno già segnalato che la implementazione di equals() non va bene ma io aggiungo che se vuoi fare l'override del "vero" equals() di Object il parametro deve essere Object, non ArticoloInSupermercato.

    2) Le convenzioni sulla denominazione di variabili e metodi non sono state usate/rispettate.

    3) Manca la istanziazione di un array String[] per reparti (non basta assegnare gli elementi!).

    4) Il "design" non va bene e mi riferisco a quell'array reparti e a quel test nel costruttore con println poco utile. L'array 'reparti' lo usi insieme a 'indice_Reparto' solo nel toString() e .... allora che serve? Non era meglio mettere una variabile di istanza String per il reparto?
    La classe ArticoloInSupermercato non dovrebbe sapere quanti reparti ci sono né preoccuparsi di garantire o verificare che un reparto esista.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    157
    Originariamente inviato da andbin
    1) Ti hanno già segnalato che la implementazione di equals() non va bene ma io aggiungo che se vuoi fare l'override del "vero" equals() di Object il parametro deve essere Object, non ArticoloInSupermercato.

    2) Le convenzioni sulla denominazione di variabili e metodi non sono state usate/rispettate.

    3) Manca la istanziazione di un array String[] per reparti (non basta assegnare gli elementi!).

    4) Il "design" non va bene e mi riferisco a quell'array reparti e a quel test nel costruttore con println poco utile. L'array 'reparti' lo usi insieme a 'indice_Reparto' solo nel toString() e .... allora che serve? Non era meglio mettere una variabile di istanza String per il reparto?
    La classe ArticoloInSupermercato non dovrebbe sapere quanti reparti ci sono né preoccuparsi di garantire o verificare che un reparto esista.
    lol hai ragione come al solito andbin

    non le avevo nemmeno notate queste cose thx andbin

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.