Problema con variabile STATIC, impedire modifiche esterne

di il
14 risposte

Problema con variabile STATIC, impedire modifiche esterne

Ciao a tutti, ho un prolema con una variabile static ... ma prima voglio chiedere alcune cose ...

public class PersonaStatic {
		//STATO INTERNO:
		int id;
		static int ID_CORRENTE; 
		String nome, cognome;
		
		//COSTRUTTORE:
		public PersonaStatic(String nome, String cognome) {
			this.nome = nome; 
			this.cognome = cognome;
			
			this.ID_CORRENTE++;
			this.id = this.ID_CORRENTE;
		}
}
Nella classe PersonaStatic ... avrei potuto scrivere in questo modo senza utilizzare il this?

ID_CORRENTE++;
id=ID_CORRENTE;

lo chiedo perchè a prima vista, sembrano non esserci problemi di sorta.

ORA ARRIVO AL DUNQUE CON LA VARIABILE STATIC ...


public class StaticMain {
	public static void main(String[] args) {

		//CREO OGGETTI DI TIPO PERSONA
		PersonaStatic lui = new PersonaStatic("Pippo", "Baudo");
		PersonaStatic lei = new PersonaStatic("Maria", "Callas");
		PersonaStatic io = new PersonaStatic("Luca", "Titis");
		PersonaStatic tu = new PersonaStatic("Peppino", "Di Capri");
		
		System.out.println("Numero oggetti PersonaStatic creati: " + PersonaStatic.ID_CORRENTE);
		System.out.println(lui.nome + " " + lui.cognome + ", id: " + lui.id);
		System.out.println(lei.nome + " " + lei.cognome + ", id: " + lei.id);
		System.out.println(io.nome + " " + io.cognome + ", id: " + io.id);
		System.out.println(tu.nome + " " + tu.cognome + ", id: " + tu.id);
		
		System.out.println("Numero oggetti PersonaStatic creati: " + PersonaStatic.ID_CORRENTE);
	}
}
come posso impedire che al di fuori della classe PersonaStatic sia modificata la variabile statica?
Di fatti se scrivo in StaticMain

PersonaStatic.ID_CORRENTE=45;

sballa tutto ...

grazie!

14 Risposte

  • Re: Problema con variabile STATIC, impedire modifiche esterne

    Ciao, se la dichiari come final static dovresti risolvere tutto.
  • Re: Problema con variabile STATIC, impedire modifiche esterne

    Grazie
  • Re: Problema con variabile STATIC, impedire modifiche esterne

    nelloskybus ha scritto:


    Nella classe PersonaStatic ... avrei potuto scrivere in questo modo senza utilizzare il this?
    Sì, tecnicamente corretto.

    nelloskybus ha scritto:


    come posso impedire che al di fuori della classe PersonaStatic sia modificata la variabile statica?
    Dichiarala private (ovviamente non devi permettere l'accesso con metodi "accessori"). Sarà visibile solo dentro PersonaStatic.

    P.S. se la rendi final non può certamente fare da "contatore".
  • Re: Problema con variabile STATIC, impedire modifiche esterne

    Ok provo così ... appena posso ... grazie
  • Re: Problema con variabile STATIC, impedire modifiche esterne

    BLINDO così la variabile static ... passando direttamente la variabile static
    
    public class PersonaStatic {
    			
    		//STATO INTERNO:
    		int id;
    		private static int ID_CORRENTE; 
    		String nome, cognome;
    		
    		//COSTRUTTORE:
    		public PersonaStatic(String nome, String cognome) {
    			this.nome = nome; 
    			this.cognome = cognome;
    						
    			ID_CORRENTE++;
    			id = ID_CORRENTE;
    		}
    		
    		public int getId(){ // Restituisce il numero degli oggetti creati
    			return ID_CORRENTE;
    		}
    }
    
    
    Poi in main ... richiamo la variabile static così:

    System.out.println("Numero oggetti PersonaStatic creati: " + lui.getId());


    DUBBIO: mi sembra sbagliato che per conoscere il valore della variabile static, la devo copiare in un altra e poi leggere il tutto da un oggetto creato ... se non creassi nessun oggetto non mi darebbe zero !

    Infatti se scrivessi: System.out.println("Numero oggetti PersonaStatic creati: " + PersonaStatic.RitornaId());

    SAREBBE UN CLAMOROSO ERRORE!


    Ovviamente in questo modo, l'istruzione darebbe errore ... quindi la variabile essendo static è protetta:

    PersonaStatic.ID_CORRENTE=45;


    ALTRO DUBBIO GRANDE ... se scrivessi:

    tu.id = 55;
    System.out.println(tu.nome + " " + tu.cognome + ", id: " + tu.id);

    l'id verrebbe sballato ... COME PROTEGGERLO?

    CHE DEVO FARE? AIUTOOO
  • Re: Problema con variabile STATIC, impedire modifiche esterne

    nelloskybus ha scritto:


    
    		public int getId(){ // Restituisce il numero degli oggetti creati
    			return ID_CORRENTE;
    		}
    
    Poi in main ... richiamo la variabile static così:

    System.out.println("Numero oggetti PersonaStatic creati: " + lui.getId());
    Dal momento che il campo è static .... anche il getter dovrebbe essere static. Perché getId di istanza farebbe pensare che ha a che fare con una singola istanza, ma non è così.

    E la invocazione dovrebbe quindi diventare: PersonaStatic.getId()

    nelloskybus ha scritto:


    tu.id = 55;
    System.out.println(tu.nome + " " + tu.cognome + ", id: " + tu.id);

    l'id verrebbe sballato ... COME PROTEGGERLO
    idem: private. Serve a questo ...
  • Re: Problema con variabile STATIC, impedire modifiche esterne

    Grande ... grazie ... provo tutto appena posso
  • Re: Problema con variabile STATIC, impedire modifiche esterne

    Ho ultimato il tutto secondo i suggerimenti ricevuti ... volevo solo conferma di aver fatto il tutto correttamente ...
    
    public class PersonaStatic {
    		
    		//STATO INTERNO:
    		private  int id;
    		private static int ID_CORRENTE; 
    		String nome, cognome;
    		
    		//COSTRUTTORE:
    		public PersonaStatic(String nome, String cognome) {
    			this.nome = nome; 
    			this.cognome = cognome;
    						
    			ID_CORRENTE++; //Incrementa il numero dell'id per ogni oggetto PersonaStatic creato ... 
    			id = ID_CORRENTE; // ... così sarà un numero unico per ciascun id, dei singoli oggetti persona creati.
    		}
    		
    		//METODI:
    		public static int getIdCreate(){ 
    			return ID_CORRENTE;
    		}
    		
    		public  int getId(){
    			return id;
    		}
    }
    
    Mentre invece nel main ...
    
    public class StaticMain {
    	public static void main(String[] args) {
    		PersonaStatic lui = new PersonaStatic("Pippo", "Baudo");
    		PersonaStatic lei = new PersonaStatic("Maria", "Callas");
    		PersonaStatic io = new PersonaStatic("Luca", "Titis");
    		PersonaStatic tu = new PersonaStatic("Peppino", "Di Capri");
    		
    		System.out.println("Numero oggetti PersonaStatic creati: " + PersonaStatic.getIdCreate());
    		System.out.println(io.nome + " " + io.cognome + ", id: " + io.getId()); 
    	}
    }
    
    aspetto conferme e suggerimenti ... grazie!

    ps. se c'è un modo migliore per fare il tutto ... fatemelo sapere, sono un autodidatta ...
  • Re: Problema con variabile STATIC, impedire modifiche esterne

    nelloskybus ha scritto:


    aspetto conferme e suggerimenti ... grazie!

    ps. se c'è un modo migliore per fare il tutto ... fatemelo sapere, sono un autodidatta ...
    Tecnicamente è corretto. Concettualmente sarebbe meglio che anche nome/cognome siano private e con i relativi metodi getter (anche i setter se volessi renderli mutabili).

    Ricorda che i campi generalmente è meglio sempre nasconderli, quindi private. In certi casi, in base al design delle classi (spesso quando ci sono sottoclassi) è utile mettere certi campi protected. Praticamente mai (o raramente) public o con livello di accesso di default (=package level) come nel tuo caso.
  • Re: Problema con variabile STATIC, impedire modifiche esterne

    Come suggerito, ho modificato in modo tale che le variabili dell'oggetto, possano essere modificate unicamente utilizando dei metodi.
    Ho però un dubbio, volevo una conferma ...
    
    public class PersonaStatic {
    			
    		//STATO INTERNO:
    		private  int id;
    		private static int ID_CORRENTE; 
    		String nome, cognome;
    		
    		//COSTRUTTORE:
    		public PersonaStatic(String nome, String cognome) {
    			
    			this.setNome(nome);
    			this.setCognome(cognome);			
    	
    			ID_CORRENTE++; //Incrementa il numero dell'id per ogni oggetto PersonaStatic creato ... 
    			id = ID_CORRENTE; // ... così sarà un numero unico per ciascun id, dei singoli oggetti persona creati.
    		}
    		
    		//NOTA: anzichè accedere direttamente alle variabili(cosa impossibile perchè private), accedo ai metodi che mi consentono di leggerle
    		
    		//METODI in lettura:
    		
    		public static int getIdCreate(){ 
    			return ID_CORRENTE;
    		}
    		
    		public  int getId(){
    			return id;
    		}
    	
    		//METODI in scrittura:	
    		public void setNome(String nome){
    			this.nome = nome;
    		}
    		
    		public void setCognome(String cognome){
    			this.cognome= cognome;
    		}
    }
    
    Mentre invece nel main rimane tutto uguale ...
    
    public class StaticMain {
    	public static void main(String[] args) {
    		PersonaStatic lui = new PersonaStatic("Pippo", "Baudo");
    		PersonaStatic lei = new PersonaStatic("Maria", "Callas");
    		PersonaStatic io = new PersonaStatic("Lucas", "Titis");
    		PersonaStatic tu = new PersonaStatic("Peppino", "Di Capri");
    		
    		System.out.println("Numero oggetti PersonaStatic creati: " + PersonaStatic.getIdCreate());
    		System.out.println(io.nome + " " + io.cognome + ", id: " + io.getId()); 
    	}
    }
    

    DOMANDA: nel costruttore dell'oggetto, con .... public PersonaStatic(String nome, String cognome) ... il compilatore si aspetta l'ingresso di due parametri(sono formali o cosa?), questi due paramentri a loro volta vengono utilizzati per costruire l'oggetto con ad esempio ... this.setNome(nome); ... il che equivale a dire ... i parametri necesari per costruire l'oggetto, li prendi dal metodo in scrittura ...(as es. public void setNome(String nome) ...).

    ***** DATO CHE MI SONO INGARBUGLIATO E MI SONO CONFUSO DA SOLO ... potresti dirmi, se quel che ho fatto è corretto, e se equivale a quello che ho descritto(sempre se, mi son riuscito a spiegare ...

    GRAZIEEEEEEEEEEEE
  • Re: Problema con variabile STATIC, impedire modifiche esterne

    nelloskybus ha scritto:


    Come suggerito, ho modificato in modo tale che le variabili dell'oggetto, possano essere modificate unicamente utilizando dei metodi.
    ***** DATO CHE MI SONO INGARBUGLIATO E MI SONO CONFUSO DA SOLO ... potresti dirmi, se quel che ho fatto è corretto, e se equivale a quello che ho descritto(sempre se, mi son riuscito a spiegare ...
    Hai sì modificato qualcosa ma non come dicevo io. I campi nome/cognome li hai ancora con livello di accesso di default (non sono private), hai solo aggiunto dei setter (che nel tuo caso e per quello che fai in StaticMain non servirebbero nemmeno) e i getter non li hai messi.

    a) Metti i campi nome/cognome con il modificatore di accesso private.

    b) Metti dei metodi "getter" per nome/cognome e usali dove necessario in StaticMain (non puoi più accedere direttamente ai campi, se sono private).

    c) Se vuoi, ripeto è opzionale, puoi mettere i metodi "setter" per nome/cognome se dovessero servire per qualunque motivo in StaticMain o altrove. E se li metti puoi (non è obbligatorio) usarli anche nel costruttore di PersonaStatic.
  • Re: Problema con variabile STATIC, impedire modifiche esterne

    Per favore ... sii paziente, dimmi se va bene
    
    public class PersonaStatic {
    		
    		//STATO INTERNO ... variabili d'istanza:
    		private  int id;
    		private static int ID_CORRENTE; 
    		private String nome, cognome;
    		
    		//COSTRUTTORE:
    		public PersonaStatic(String nome, String cognome) {
    			
    			this.setNome(nome);
    			this.setCognome(cognome);
    								
    			ID_CORRENTE++; //Incrementa il numero dell'id per ogni oggetto PersonaStatic creato ... 
    			id = ID_CORRENTE; // ... così sarà un numero unico per ciascun id, dei singoli oggetti persona creati.
    		}
    		
    		//NOTA: anzichè accedere direttamente alle variabili(cosa impossibile perchè private), accedo ai metodi che mi consentono di leggerle
    		//METODI:
    		
    		public static int getIdCreate(){ 
    			return ID_CORRENTE;
    		}
    		
    		public  int getId(){
    			return id;
    		}
    		
    		public void setNome(String nome){
    			this.nome = nome;
    		}
    		
    		public String getNome(){
    			return nome;
    		}
    		
    		
    		public void setCognome(String cognome){
    			this.cognome = cognome;
    		}
    		
    		public String getCognome(){
    			return cognome;
    		}
    }
    
    Mentre invece nel main ...
    
    public class StaticMain {
    	public static void main(String[] args) {
    		PersonaStatic lui = new PersonaStatic("Pippo", "Baudo");
    		PersonaStatic lei = new PersonaStatic("Maria", "Callas");
    		PersonaStatic io = new PersonaStatic("Lucas", "Titis");
    		PersonaStatic tu = new PersonaStatic("Peppino", "Di Capri");
    		
    		System.out.println("Numero oggetti PersonaStatic creati: " + PersonaStatic.getIdCreate());
    		System.out.println(io.getNome()+ " " + io.getCognome() + ", id: " + io.getId());
    		
    		io.setCognome("Esaurito");
    		System.out.println(io.getNome()+ " " + io.getCognome() + ", id: " + io.getId());
    	}
    }
    

    Intendevi in questo modo? ...
  • Re: Problema con variabile STATIC, impedire modifiche esterne

    nelloskybus ha scritto:


    Intendevi in questo modo? ...
    Sì, adesso è ben strutturata, con i campi ben nascosti e i metodi getter/setter pubblici (è sicuramente meglio di prima!).
  • Re: Problema con variabile STATIC, impedire modifiche esterne

    Grazie di tutto ...
Devi accedere o registrarti per scrivere nel forum
14 risposte