2010-04-15 4 views
9

Che cosa significa per un metodo essere pubblico/privato/altro in java?
Quali sono i vantaggi e gli svantaggi di queste opzioni?
Qual è il mio impulso, come qualcuno che cerca di essere un buon programmatore, a cui interessare?Cosa significa per un metodo essere pubblico/privato/altro in java?

+9

Sun tutorial: http://java.sun.com/docs/books/tutorial/ java/javaOO/accesscontrol.html – BalusC

+0

I secondo il tutorial o un tutorial OOP di base. I concetti sono gli stessi per tutte le lingue OO in relazione all'incapsulamento/accesso ai dati. –

+0

Cosa significa OOP? – David

risposta

13

Quando un metodo è pubblico che significa che può essere letta da altri oggetti

Ad esempio:

class David { 
    // public method, can be use by anyone 
    public String getName() { 
     return "David"; 
     } 
} 

Procedimento getName sono accessibili tramite altre classi perché è pubblico:

class Other { 
     David davidOne = new David(); 
     String davidsName = davidOne.getName(); //<-- compiles and runs 
} 

Il vantaggio .. beh, puoi usarlo da altri posti.

Quando un metodo è privato che significa che può accedere solo oggetti DELLA STESSA CLASSE

Ad esempio, in questa nuova definizione:

class David { 
    public String getName() { 
     return "David"; 
    } 
    // private method... nobody but David's "instances" can use it.. 
    private int getAge() { 
     return 19; 
    } 

} 

Procedimento getAge può' Si può accedere ad altre classi perché è privato, se si tenta di farlo, il compilatore ti darà un messaggio di errore:

class Other { 
     David davidOne = new David(); 
     String davidsName = davidOne.getName(); 
     int davidsAge = davidOne.getAge(); //<-- Compiler error, getAge() is not visible 
} 

Ma, se è possibile utilizzarlo all'interno David classe:

class David { 
    public String getName() { 
     return "David"; 
    } 
    // private method... nobody but David's "instance" can use it.. 
    private int getAge() { 
     return 19; 
    } 
    // Here the call to "getAge()" will succeed, because it is visible 
    // inside the class 
    public boolean hasSameAgeAs(David otherDavid) { 
     return this.getAge() == otherDavid.getAge(); 
    } 
} 

Il vantaggio? È possibile creare un sacco di metodi e tenerli privati, evitando il danneggiamento dei dati o, in generale, conservare gli oggetti encapsulated

A proposito di incapsulamento

In OOP (programmazione orientata agli oggetti) l'intenzione è quella di modellare il software dopo il Real oggetti di vita.

Gli oggetti della vita reale dispongono (tra le altre cose) di attributi e metodi per accedere a tali attributi.

Si desidera rendere pubblici alcuni di questi metodi e mantenere altri privati.

Ad esempio, un essere umano umano, ha un cuore. Ma non è esposto a tutti, sarebbe pericoloso. È incapsulato nel all'interno del nostro corpo.

Se dovessimo modellare un software dopo un vero e proprio umana possiamo dichiarare il metodo: heartBeat come private (così, nessuno può accedervi)

In altra parte, sarebbe utile per essere venuto metodi pubblici come getGender per scoprire se l'istanza di umana di è di sesso maschile o femminile.

Ci sono altri modificatori di accesso come ad esempio: "protetta" e il pacchetto protetto (la cui non ha una parola chiave)

class David { 
     // protected method 
     protected int getBalance() { 
      return 1000000; 
     } 
     // package protected or "default" method 
     boolean knowsOop(){ 
      return true; 
     } 
} 

C'è il metodo getBalance può essere accesed solo da David istanze e David sottoclassi (creare un altro thread per ciò che è una sottoclasse)

Il metodo knowsOop può essere accessibile da chiunque all'interno del pacchetto come David è definito.

Non preoccuparti di questi due modificatori di accesso, avranno senso quando si impara di più su OOP e Java.

Infine si dovrebbe davvero, davvero prendere tempo per leggere:

http://java.sun.com/docs/books/tutorial/java/javaOO/index.html

Spero che questo aiuta

0

il motivo principale è chiamato incapsulamento: non consentire l'accesso allo stato interno dell'oggetto.

+0

Potresti per favore entrare in maggiori dettagli? – David

+0

Un oggetto può avere uno stato; ad esempio, potrebbe avere le proprietà dei colori mutevoli in primo piano e sullo sfondo. Questo stato verrebbe tenuto nell'oggetto come valore (s) di qualche tipo di variabile (s). L'implementatore potrebbe voler stabilire delle restrizioni su come i colori possono cambiare (ad esempio, entrambi i colori potrebbero non essere gli stessi). Se le variabili fossero pubbliche e direttamente accessibili, gli utenti potrebbero violare la condizione (nota anche come invariante), spostando l'oggetto in uno stato non previsto/illegale. L'implementatore può invece rendere private le variabili e consentire mutazioni valide tramite un metodo pubblico. –

1

HThe i modificatori pubblici, protetti e privati ​​controllano quali altri codici possono vedere quei metodi (o campi). Si tratta di controllare l'interfaccia che stai esponendo.

Quelli comunemente utili sono:

Il modificatore pubblico: qualsiasi altro può vedere il tuo metodo.

Il modificatore privato: nessun codice diverso dalla classe e le classi interne possono visualizzare il metodo.

Questi sarebbero utili, ad esempio, se si desidera garantire che sia stata creata una sola istanza di una classe (singleton pattern). Si potrebbe fare il privato costruttore, creare una singola istanza e conservare è come un membro privato chiamato esempio, e di fornire un metodo pubblico qualcosa di simile:

public static MyObject getInstance() { 
    return instance; 
} 

e così si può garantire che non ci sarà solo ogni essere un caso .


Aggiornamento: un altro esempio come richiesto.

Un altro esempio potrebbe essere dove si dispone di un metodo pubblico complesso e si desidera suddividerlo in parti più semplici. Potresti suddividerlo in metodi simplr, ognuno facendo una parte del lavoro, ma non vorresti che altri codici chiamassero quei metodi part, dato che non funzionerebbero da soli, quindi renderei i metodi più piccoli privati, assicurandoti che non possono essere chiamati fuori dalla tua classe.

+0

Potrebbe per favore entrare in maggiori dettagli sull'utilità? – David

+0

non è possibile richiamare MyObject più volte? questo non porterebbe alla creazione di istanze più mutevoli della classe? – David

+0

No, la chiamata a MyObject.getInstance() non crea una nuova istanza, ma restituisce solo quella già creata. Le ripetute invocazioni continueranno a restituire la stessa istanza. – Brabster

1

I metodi privati ​​ possono essere chiamati solo all'interno della classe. Puoi chiamare i metodi pubblicidella tua classe ovunque nel programma. I metodi senza modificatore di accesso hanno lo scopo di visibilità del pacchetto (si chiama predefinito), quindi è possibile richiamarlo ovunque nel pacchetto, dove è definita la classe.

Vedi http://en.wikipedia.org/wiki/Object_oriented_programming#Encapsulation

+0

qual è il mio slancio per far sì che un metodo possa essere chiamato solo all'interno della classe? – David

+0

A volte è necessario un metodo solo all'interno di una classe. Può essere una funzione di conversione o qualsiasi altro pezzo di codice supplementare. – Dmitry

+1

Non è sempre consigliabile implementare una funzionalità esposta attraverso un metodo pubblico, nel corpo del metodo pubblico stesso. Un metodo pubblico potrebbe dover chiamare altri metodi per eseguire il suo comportamento. Questi altri metodi sono quindi destinati all'uso interno e dovrebbero essere contrassegnati come privati. –

5

Un metodo pubblico si può accedere da ovunque, un metodo privato solo dalla stessa classe. Il vantaggio principale è il controllo dell'API di una classe. Se pubblico solo ciò che è necessario, posso modificare il comportamento interno di una classe, senza interrompere il codice a seconda di questa classe. Dovresti preoccuparti, perché il software cambia spesso nel mondo reale (almeno è la mia esperienza e altri lo hanno anche) e più ogni cambiamento si interrompe, più energia devi mettere in manutenzione o più bug il tuo software ha. Alla fine è una questione di costi.

La possibilità di nascondere gli interni della classe dagli utenti di questa classe per evitare l'interruzione del codice in seguito a modifiche successive viene spesso chiamata incapsulamento o information hiding.

Le due opzioni oltre a public e private sono package (senza un modificatore) e protected.È possibile accedere al metodo accessibile ai pacchetti anche all'interno delle classi dello stesso pacchetto. Non mi ricordo di aver usato quell'opzione in alcun modo utile. i metodi protetti sono accessibili dalle classi, che ereditano la classe in questione. Viene spesso utilizzato per creare classi con comportamento concreto per un'API definita della classe base. Ad esempio, potresti implementare una nuova classe List estendendo AbstractList e devi solo implementare get e size (e un metodo set per gli elenchi modificabili). Gli altri metodi esposti dall'API di List sono definiti nella classe base, chiamando gli altri tre metodi se necessario.

0

Per cominciare, vorrei iniziare a limitare l'accesso il più possibile. Inizia con private. Se vi capita di bisogno il costruttore, metodo o campo da qualche altra parte, ma non è possibile accedervi a causa delle restrizioni, quindi i prossimi passi potrebbe essere quella di chiedere a te stesso:

  1. Se si tratta di un metodo, non si ha realmente bisogno per accedervi? Cambia il comportamento della classe/istanza? Non dovresti lasciare che questa classe faccia il lavoro? Non dovrebbe la classe attuale (che ha bisogno di quel campo o metodo) essere portata più stretta a quella classe?
  2. Se si tratta di un campo, è necessario ottenere o impostare il suo valore? Non dovresti aggiungere un metodo che fa esattamente questo?

Punto 1 evita l'accoppiamento errato e il punto 2 migliora l'incapsulamento. Una volta che hai considerato quanto sopra e concluso che sono necessarie meno restrizioni, quindi impostalo su un gradino o più ulteriormente aperto.

Problemi correlati