2012-12-19 8 views
12

Quando stavo imparando l'edizione standard di Java, le funzioni getter e setter venivano spesso utilizzate per nascondere le variabili e per ridurre l'accesso diretto ad esse. Mi è stato detto da diverse fonti che in Android non dovresti usare queste funzioni e modificare solo le variabili direttamente. Il motivo è che c'è una perdita di prestazioni a causa di spese generali quando si utilizzano getter e setter è utilizzato in Android. Con conseguente maggiore utilizzo della memoria e rallentamento del sistema.Funzioni di setter e getter. In Android. Sovraccarico delle prestazioni?

C'è qualche verità in questo? e se c'è, perché la perdita di prestazioni per l'utilizzo di getter e setter?

+1

Secondo [d.android] (http://developer.android.com/training/articles/perf -tips.html # internal_get_set) dovresti evitarli. Buona domanda! Anche se devo chiedermi, quale colpo avrebbe avuto la mia app se avessi fatto il contrario di tutto ciò che suggeriscono? –

+0

I documenti dicono di evitarli ma non credo che lo stress sia significativo nella maggior parte dei casi. Li uso occasionalmente per esporre alcuni campi, ma potresti volerlo semplicemente usare con l'ipotesi che aggiungano un sovraccarico. Tieni le chiamate fuori da loop/processa blocchi intensi e dovresti essere ok. –

risposta

9

Come da documentazione trovata here utilizzando un getter e setter è una cattiva idea in Android. Come si dice,

questa è una cattiva idea su Android. Le chiamate al metodo virtuale sono costose, molto più delle ricerche di campi di istanze. È ragionevole seguire le pratiche di programmazione orientate agli oggetti comuni e avere getter e setter nell'interfaccia pubblica, ma all'interno di una classe è sempre necessario immettere direttamente i campi di accesso .

Ulteriori informazioni sulle prestazioni here.

+6

Per aggiungere a questo: Questo punta in gran parte a * internal * ottenere e impostare utilizzando questa metodologia quando il metodo * è banale *. Per le buone pratiche di programmazione, le chiamate * esterne * ai valori devono essere effettuate da getter e setter; e l'ottenimento e l'impostazione interni non banali dovrebbero essere fatti attraverso i metodi allo scopo di [DRY] (http://en.wikipedia.org/wiki/Don't_repeat_yourself). – Eric

+0

@Eric grazie per quello. – Vinay

4

Le perdite di prestazione per setter e getter sono trascurabili. I campi pubblici sono cattive pratiche e violano i principi orientati agli oggetti dell'incapsulamento dei dati e dell'occultamento delle informazioni.

L'utilizzo di un setter o getter richiede una chiamata di proprietà oltre all'accesso diretto al campo. Non è niente, quindi non preoccuparti: concentrati sulla scrittura di un buon codice.

edit:

Per chiarire, questo è dallo stesso documento Android che gli altri manifesti sono citando:

E 'ragionevole seguire le pratiche di programmazione orientata agli oggetti comuni e hanno getter e setter in l'interfaccia pubblica, ma all'interno di una classe devi sempre accedere direttamente ai campi.

In altre parole, hai ancora bisogno di getter e setter. Dovresti solo cercare di evitare di chiamarli dall'interno della classe che contiene quei metodi poiché hai accesso diretto al campo.

+0

qualche spiegazione per il downvote? –

+3

come indicato nella risposta di @ hungr, la loro performance è probabilmente non "trascurabile" (3-7X più lento) in Android, ma in caso contrario la risposta è esatta - accesso diretto all'interno della classe, getter/setter per l'esterno per tutte le classi, ma banali . – iagreen

7

Secondo i suggerimenti di prestazioni fornite da Google team di Android:

Senza un JIT, accesso campo diretto è circa 3 volte più veloce di invocare un getter banale . Con il JIT (dove l'accesso diretto al campo costa meno di l'accesso a un locale), l'accesso diretto al campo è circa 7 volte più veloce di invocando un getter banale.

Tuttavia Sono d'accordo che una buona pratica di codifica è più importante e il team ha anche detto che:

Si noti che se si sta utilizzando ProGuard, si può avere il meglio dei due mondi perchè ProGuard può in linea accessori per te.

Perciò penso che sia ok per utilizzare il getter e setter;)

Reference