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
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).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 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:
Se hour e minutes non fossero private potrei fare questo: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); } } }
che è chiaramente sensa senso.codice:Time time = new Time(); time.hour = 100; time.minutes = -1297;
Se provo invece a fare
ottengo errore a runtime che mi impediscono di costruire un oggetto "sbagliato".codice:Time time = new Time(); time.setHour(100); // eccezione! time.setMinutes(-1297);
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
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....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)
Ma il dubbio è allora perchè non crearla pubblica? se tanto anche la creo privata ho il modo di accedervi...
Ho aggiornato l'esempioOriginariamente 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...![]()
SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
Di questo libro e degli altri (blog personale di recensioni libri) | NO M.P. TECNICI
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?Originariamente inviato da Alex'87
Ho aggiornato l'esempio![]()
Ti faccio un esempio:
codice:public class Prova { public int test = 10; }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è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); } }
Scusami l'insistenza ma è importante che lo capisca....
Grazie in anticipo.
Perché dovrebbero visualizzare entrambe 20?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è
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
si giusto... errore stupido... e solo che sto cercando di capire bene quando e perchè usare uno piuttosto che un altro....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)
nel senso quando usare uno e quando l'altra?
AttributiOriginariamente 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?
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:
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)?codice:public static void quicksort(int[] array, int start, int end) { ... }
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:
Il programmatore che userà la classe ArrayUtils vedrà solo il metodo pubblico, dell'altro non gliene importerà nulla, è come se per lui non esistesse.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); } }
Quello che farà sarà solo
Fine, senza preoccuparsi di partizioni ecc.codice:int[] array = {21, 4, 12, 100, 43, ... ecc}; ArrayUtils.quicksort(array);
SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
Di questo libro e degli altri (blog personale di recensioni libri) | NO M.P. TECNICI
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.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:
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)?codice:public static void quicksort(int[] array, int start, int end) { ... }
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:
Il programmatore che userà la classe ArrayUtils vedrà solo il metodo pubblico, dell'altro non gliene importerà nulla, è come se per lui non esistesse.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); } }
Quello che farà sarà solo
Fine, senza preoccuparsi di partizioni ecc.codice:int[] array = {21, 4, 12, 100, 43, ... ecc}; ArrayUtils.quicksort(array);
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.