Visualizzazione dei risultati da 1 a 9 su 9

Discussione: modificatore private

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    324

    modificatore private

    Ciao a tutti,

    apro questa discussione perchè ho dei dubbi sull'utilizzo del modificatore private...
    Nel senso quando si deve usare tale modificatore e perchè?


    Grazie anticipatamente

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: modificatore private

    Originariamente inviato da manublack
    Ciao a tutti,

    apro questa discussione perchè ho dei dubbi sull'utilizzo del modificatore private...
    Nel senso quando si deve usare tale modificatore e perchè?


    Grazie anticipatamente
    Per quanto riguarda gli attributi, si usa SEMPRE (tranne quando entra in gioco l'ereditarietà, in questo caso spesso è più utile protected).

    Per quanto riguarda i metodi, va usato su tutti i metodi che la classe non deve esporre (cioè su quei metodi interni che il programmatore non deve poter chiamare direttamente).

    Come si può intuire dal nome impedisce che un attributo/metodo sia accessibile direttamente al programmatore.

    TI faccio un esempio:

    codice:
    public class Time {
        private int hour;
        private int minutes;
    
        public void setHour(int hour) {
            check(minutes, 0, 23, "hour");
            
            this.hour = hour;
        }
        
        public int getHour() {
            return hour;
        } 
        
        public void setMinutes(int minutes) {
            check(minutes, 0, 59, "minutes");
        
            this.minutes = minutes;
        }
        
        public int getMinutes() {
            return minutes;
        }
        
        private void check(int value, int min, int max, String propertyName) {
            if (value < min || value > max) {
                throw new IllegalArgumentException(min + " <= " + propertyName + " < " + max);
            }
        }
    }
    Se hour e minutes non fossero private potrei fare questo:

    codice:
    Time time = new Time();
    time.hour = 100;
    time.minutes = -1297;
    che è chiaramente sensa senso.

    Se provo invece a fare

    codice:
    Time time = new Time();
    time.setHour(100); // eccezione!
    time.setMinutes(-1297);
    ottengo errore a runtime che mi impediscono di costruire un oggetto "sbagliato".

    check() inoltre è un metodino di supporto che non ha senso che "esista" al di fuori di questa classe.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    324

    Re: Re: modificatore private

    Originariamente inviato da Alex'87
    Per quanto riguarda gli attributi, si usa SEMPRE (tranne quando entra in gioco l'ereditarietà, in questo caso spesso è più utile protected).

    Per quanto riguarda i metodi, va usato su tutti i metodi che la classe non deve esporre (cioè su quei metodi interni che il programmatore non deve poter chiamare direttamente)
    ti ringrazio per la risposta, ma non riesco a capire una cosa, nel senso che se io dichiaro una variabile privata in teoria è visibile solo all'interno della stessa classe, ma esiste un escamotage nel senso che esistono i metodi get e setter per accedere a quella variabile privata....
    Ma il dubbio è allora perchè non crearla pubblica? se tanto anche la creo privata ho il modo di accedervi...

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Re: Re: modificatore private

    Originariamente inviato da manublack
    ti ringrazio per la risposta, ma non riesco a capire una cosa, nel senso che se io dichiaro una variabile privata in teoria è visibile solo all'interno della stessa classe, ma esiste un escamotage nel senso che esistono i metodi get e setter per accedere a quella variabile privata....
    Ma il dubbio è allora perchè non crearla pubblica? se tanto anche la creo privata ho il modo di accedervi...
    Ho aggiornato l'esempio
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    324

    Re: Re: Re: Re: modificatore private

    Originariamente inviato da Alex'87
    Ho aggiornato l'esempio
    Si ho visto e ti ringrazio per l'esempio che mi hai fatto.... Ma non riesco a capire che differenza fa nel creare una variabile privata piuttosto che pubblica?

    Ti faccio un esempio:

    codice:
         public class Prova {  	
                public int test = 10; 	 
         }
    codice:
    package main; 
    
    public class HelloWord {  	
                /** 	 * @param args 	 */ 	 	
                
                public static void main(String[] args) { 		
                    // TODO Auto-generated method stub 		 		
                    String name = "prova",pippo = "test",pluto = "ciao";
                    System.out.println("Hello Word " + name + " " + pippo + " " + pluto);
                    
                    Prova prova = new Prova(); 		
                    prova.test = 30; 		 		
    
                    Prova prova1 = new Prova(); 		
                    prova1.test = 20; 		 		
    
                    System.out.println("prova: " + prova.test + " prova1: " + prova1.test); 	}	 
     }
    Io mi aspettavo che entrambe le stampe visualizzassero 20 come risultato.... cosa che non è cosi.... e allora mi chiedo se la dichiaro privata che differenza fa? Nel senso che se tanto ho sempre i metodi get e setter che mi permettono di modificare il valore della variabile che differenza cè

    Scusami l'insistenza ma è importante che lo capisca....

    Grazie in anticipo.

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Re: Re: Re: Re: modificatore private

    Originariamente inviato da manublack


    codice:
    Prova prova = new Prova(); 		
    prova.test = 30; 		 		
    
    Prova prova1 = new Prova(); 		
    prova1.test = 20;

    Io mi aspettavo che entrambe le stampe visualizzassero 20 come risultato.... cosa che non è cosi.... e allora mi chiedo se la dichiaro privata che differenza fa? Nel senso che se tanto ho sempre i metodi get e setter che mi permettono di modificare il valore della variabile che differenza cè
    Perché dovrebbero visualizzare entrambe 20?

    prova e prova1 sono due oggetti distinti, che non hanno nulla a che fare l'uno con l'altro.

    Tu crei prova e dai alla SUA variabile test il valore 30.
    Poi crei prova1 e dai alla SUA variabile test il valore 20.

    prova.test e prova1.test sono due variabili diverse, stanno su due aree di memoria diverse.
    Diverso il caso in cui test fosse dichiarato static: in questo caso esisterebbe un'unica variabile test per tutte le istanze di Prova (ma questo non c'entra nulla con public/private)
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    324

    Re: Re: Re: Re: Re: Re: modificatore private

    Originariamente inviato da Alex'87
    Perché dovrebbero visualizzare entrambe 20?

    prova e prova1 sono due oggetti distinti, che non hanno nulla a che fare l'uno con l'altro.

    Tu crei prova e dai alla SUA variabile test il valore 30.
    Poi crei prova1 e dai alla SUA variabile test il valore 20.

    prova.test e prova1.test sono due variabili diverse, stanno su due aree di memoria diverse.
    Diverso il caso in cui test fosse dichiarato static: in questo caso esisterebbe un'unica variabile test per tutte le istanze di Prova (ma questo non c'entra nulla con public/private)
    si giusto... errore stupido... e solo che sto cercando di capire bene quando e perchè usare uno piuttosto che un altro....

    nel senso quando usare uno e quando l'altra?

  8. #8
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Re: Re: Re: Re: Re: Re: modificatore private

    Originariamente inviato da manublack
    si giusto... errore stupido... e solo che sto cercando di capire bene quando e perchè usare uno piuttosto che un altro....

    nel senso quando usare uno e quando l'altra?
    Attributi
    private/protected SEMPRE, a meno che non siano delle costanti utilizzabili da altri

    Metodi
    private/protected i metodi interni, che non devono essere utilizzati direttamente
    public per i metodi "operativi", quelli che chi usa la tua classe deve utilizzare

    Ad esempio, pensa ad una classe che fornisce un metodo per il quick sort. Per funzionare ha bisogno di (almeno) tre parametri: l'array da ordinare e due indici che indicano l'inizio e la fine della partizione in considerazione.
    Potresti avere questo metodo:
    codice:
    public static void quicksort(int[] array, int start, int end) { ... }
    Chi lo usa però deve dare troppe informazioni: lui ha l'array da ordinare, non si deve porre il problema di passare anche la partizione... Se passa dei valori sbagliati (negativi, superiori alla dimensione dell'array)?

    In un caso così puoi sfruttare private per fare due versioni del metodo: una pubblica, "semplice", e una privata che fa il lavoro sporco. Esempio:

    codice:
    public class ArrayUtils {
        private static void quicksort(int[] array, int start, int end) { 
            ...
        }
    
        public static void quicksort(int[] array) {
            quicksort(array, 0, array.length);
        }
    }
    Il programmatore che userà la classe ArrayUtils vedrà solo il metodo pubblico, dell'altro non gliene importerà nulla, è come se per lui non esistesse.

    Quello che farà sarà solo
    codice:
    int[] array = {21, 4, 12, 100, 43, ... ecc};
    ArrayUtils.quicksort(array);
    Fine, senza preoccuparsi di partizioni ecc.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    324

    Re: Re: Re: Re: Re: Re: Re: Re: modificatore private

    Originariamente inviato da Alex'87
    Attributi
    private/protected SEMPRE, a meno che non siano delle costanti utilizzabili da altri

    Metodi
    private/protected i metodi interni, che non devono essere utilizzati direttamente
    public per i metodi "operativi", quelli che chi usa la tua classe deve utilizzare

    Ad esempio, pensa ad una classe che fornisce un metodo per il quick sort. Per funzionare ha bisogno di (almeno) tre parametri: l'array da ordinare e due indici che indicano l'inizio e la fine della partizione in considerazione.
    Potresti avere questo metodo:
    codice:
    public static void quicksort(int[] array, int start, int end) { ... }
    Chi lo usa però deve dare troppe informazioni: lui ha l'array da ordinare, non si deve porre il problema di passare anche la partizione... Se passa dei valori sbagliati (negativi, superiori alla dimensione dell'array)?

    In un caso così puoi sfruttare private per fare due versioni del metodo: una pubblica, "semplice", e una privata che fa il lavoro sporco. Esempio:

    codice:
    public class ArrayUtils {
        private static void quicksort(int[] array, int start, int end) { 
            ...
        }
    
        public static void quicksort(int[] array) {
            quicksort(array, 0, array.length);
        }
    }
    Il programmatore che userà la classe ArrayUtils vedrà solo il metodo pubblico, dell'altro non gliene importerà nulla, è come se per lui non esistesse.

    Quello che farà sarà solo
    codice:
    int[] array = {21, 4, 12, 100, 43, ... ecc};
    ArrayUtils.quicksort(array);
    Fine, senza preoccuparsi di partizioni ecc.
    ok grazie per l'esempio che mi hai dato... Per concludere diciamo quindi che il modificatore private applicato a metodi o variabili permette di nascondere alle altre classi questi metodi o variabili per motivi diversi. Nel senso che applicato a una variabile ti da la padronanza di gestione su di essa, dando cosi la possibilità di non porterle modificare, ad altri, con qualsiasi valore oltre al fatto permettendo anche di effettuare dei controlli su di essa prima della valorizzazione.

    Per i metodi invece ti crei metodi il cui scopo è quello di effettuare una determinata azione senza che il programmatore che utilizza quella classe sappia che è stata fatta.

    Correggimi se ho detto delle cavolate....

    Comunque mille grazie per l'aiuto.

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.