2009-10-10 18 views
11

Sto scrivendo una funzione equals(Object obj) per una classe. Vedo che è possibile accedere ai campi privati ​​di obj dal chiamante. Così, invece di utilizzare un getter:Java: accesso ai campi privati ​​direttamente da un'altra istanza della stessa classe

Odp other = (Odp) obj; 
if (! other.getCollection().contains(ftw)) { 

} 

posso solo accedere al campo direttamente:

Odp other = (Odp) obj; 
if (! other.collection.contains(ftw)) { 

} 

è questa cattiva pratica?

+1

Potrebbe non essere un duplicato esatto ma molto vicino: http://stackoverflow.com/questions/1540159/using-getters-or -uso-campo-diretto-accesso-dentro-un-pojo – ChssPly76

risposta

6

No, non lo è. Il motivo per cui variabili private e metodi non sono accessibili da altre classi è quello di consentire di modificare gli interni della classe senza dover modificare tutto il codice che utilizza la classe (per impedire all'utente della classe, ad esempio, di impostare una variabile ad un valore che non dovrebbe mai avere).

Se si utilizzano variabili private di altri oggetti che non danneggiano nulla, perché se si ristrutturano gli interni della classe, si dovrà comunque modificare il codice all'interno della classe.

+1

Solo perché funzionerà il 99% delle volte non significa che sia la cosa giusta da fare. Rompe l'incapsulamento e accoppia le classi più strettamente per nessun altro motivo se non quello di digitare cinque caratteri. Per favore vedi la mia risposta. –

+3

"accoppia le classi più strettamente insieme" - quali classi? C'è solo una classe in questione qui, e non puoi "disgiungere" una classe da se stessa. – sepp2k

+1

Non necessariamente. Il parametro passato a equals() non è necessariamente la stessa identica classe. –

9

Tendo ad usare sempre getter, perché a volte un getter non è solo "return (foo)". A volte inizializzano le cose se sono nulle, o hanno un po 'di debug che vi loggano, o convalidano lo stato corrente in qualche modo. È più coerente.

+0

+1 Se per qualsiasi motivo "raccolta" può essere ren per chiarire lo stato è lo scopo, preferirei cambiarlo in un posto invece che in ogni dove il getter sarebbe stato usato. –

1

Questo va bene e completamente normale. È un po 'strano pensare che this possa giocare con i campi privati ​​di other, ma va bene perché non c'è niente di male che possa accadere fino a quando alcuni terzi sono in grado di distruggere gli interni di un oggetto Odp. Qualsiasi metodo della classe Odp può modificare qualsiasi membro privato di qualsiasi oggetto Odp, anche non this, ma ciò va bene dal momento che qualsiasi metodo di questo tipo può ovviamente essere considerato attendibile!

5

Non penso che questa sia una cattiva pratica, ma una caratteristica della lingua. Non solo consente di testare equals come si fa, ma è anche utile in un modello di Prototipo per la creazione di oggetti.

0

L'utilizzo di un membro privato per la classe di entità può causare il funzionamento errato della classe proxy. Immaginate di dover ibernare la classe creando una query lazy. Se si controlla la variabile membro, restituisce null. Ma se chiamate get(), recupererà i dati dal database e inizializzerà il campo.

Problemi correlati