2013-03-28 17 views
8

Durante il mio stage uno dei miei colleghi mi ha dato un suggerimento. Voglio sapere se questa è una buona pratica.Stringa privata o Stringa statica pubblica?

Quello che stavo facendo era creare classi che sono utilizzate solo per i valori che contengono e non hanno funzioni che effettivamente fanno qualcosa (a parte l'avere getter, setter e un costruttore). Ho dichiarato le mie variabili come questo:

public class ObjectIUse{ 
    Private String name; 

    public ObjectIUse(String name){ 
    this.name = name; 
    } 

    public String getName(){ 
    return name; 
    } 
} 

Quindi io non sto usando un setter perché dovrebbe sempre rimanere lo stesso. Il mio collega ha detto che posso anche fare in questo modo:

public class ObjectIUse{ 
    public final String name; 

    public ObjectIUse(String name){ 
    this.name = name; 
    } 
} 

Perché ora non abbiamo bisogno di avere qualsiasi getter o setter perché è pubblico, ma può anche non essere cambiato, perché è definitiva.

Quale sarebbe meglio? O sarebbe forse preferibile renderlo ancora privato ma anche definitivo? Voglio dire che tutte le opzioni funzionano, ovviamente. Voglio solo sapere quale è meglio e perché.

+2

Rendilo privato. Rendi finale. –

+1

Cosa disse Sayem. Le variabili dei membri pubblici sono "considerate dannose". Quando il tuo oggetto non cambia (diciamo che è "immutabile"), dichiara la variabile membro 'final'. Ciò ti obbliga a impostarlo nel costruttore e impedisce che cambi, anche se qualcuno riflette la tua istanza di classe. –

+0

Era anche quello che pensavo sarebbe stata l'opzione migliore. Qual è il tuo ragionamento? – WereWolfBoy

risposta

7

Rendi la variabile privata, perché così facendo sarai la variabile encapsulating nella tua classe. Questo ha molti vantaggi, information hiding è uno di questi, che imparerai se vai al link precedente.

Se si desidera che non cambi mai dopo la creazione, quindi renderlo definitivo.

+0

Ho già imparato a conoscere l'incapsulamento.Ho pensato che fosse strano che cercassero di insegnarmi a renderlo pubblico durante il mio stage. Lo farò comunque per il loro prodotto, perché lo fanno da soli. Tuttavia non lo farei mai per i miei progetti. – WereWolfBoy

+0

@WereWolfBoy: Sì, nel codice di qualità della produzione si dovrebbe sempre provare a utilizzare membri di dati privati. E sì, era strano che cercassero di insegnarti mentre stavi facendo un tirocinio (intendo che dovresti imparare come scrivere il codice di qualità della produzione mentre fai il tirocinio, giusto?). È comunque OK renderlo pubblico nei tuoi progetti test/play/pet, ad esempio, ma non è mai OK nel codice di qualità della produzione. Forse dovresti chiedere loro ... –

+2

Direi che questa persona è un hacker, non uno sviluppatore, e probabilmente non capisce tutte le ramificazioni della sua decisione. E, visto il suo consiglio, sarei stanco di qualsiasi cosa lui/lei mi avesse detto in futuro. Ma, tieni a mente, come stagista, ti tratteranno come se non sapessi di cosa stai parlando, quindi non provare a discutere il punto. – CodeChimp

1

Quale sarebbe meglio? O sarebbe preferibile comunque rendere lo privato ma anche definitivo?

Se si desidera essere uno sviluppatore di successo, è necessario programmare in modo corretto, efficiente e il più importante in modo sicuro. Sicurezza e prestazioni sono al primo posto.

Quando lo rendi pubblico interromperete l'incapsulamento che è molto importante e ha molti vantaggi. Ogni volta che vuoi ottenere la proprietà di Object, i Getter diventeranno tuoi amici.

Generalmente non si dovrebbe avere accesso diretto alle proprietà dell'oggetto (solo in casi estremi ma anche questi possono essere risolti in modo migliore). Getter e Setter sono designati per questi scopi: preservano l'incapsulamento e gestiscono gli oggetti in modo sicuro.

final variables vengono solitamente utilizzati per dati che non sono modificabili durante un periodo di tempo.

1

L'idea di non fornire un metodo setter a una variabile lo rende un campo di sola lettura, ciò significa che possiamo solo leggere ma non scrivere, quindi renderlo costante utilizzando la parola chiave final riepiloga tutti.

Penso che una costante sia migliore. La parola chiave final migliora le prestazioni. Per saperne di più here

1

Si dovrebbe assolutamente avere un getter e rendere il vostro campo privato. Questo è ciò che chiamiamo incapsulamento.

Inoltre rendendolo definitivo e non avendo un setter, il tuo oggetto è immutabile, che è un'ottima cosa per la programmazione parallela.

1

Un uso corretto del principio di incapsulamento consiste nel rendere tutti i campi di classe privati ​​e accedervi tramite setter e getter. Oltre a questo, potresti voler aggiungere qualsiasi logica aggiuntiva quando chiami getName(). Mentre a volte viene usata la seconda variante, la prima è migliore. Spero che questo ti aiuti.

4

Questo funziona ora perché uno String è immutabile. Ma cosa succede quando esponi il riferimento a una classe mutabile e quella classe non è sicura? Non puoi nemmeno restituire un defensive copy se lo desideri.

Per non parlare di ciò anche l'incapsulamento. Utilizzare una variabile privata e getter.

1

Suppongo che il loro ragionamento sia che averlo public mantiene il codice più semplice. Java viene criticato per essere troppo prolisso in situazioni come questa. Su un linguaggio come Javascript, dove questo sarebbe (normalmente) sempre public.

Ma questa semplicità è un compromesso con il codice sicuro, stabile ed estendibile.

Per capire perché è importante, dai un'occhiata a un progetto Javascript su larga scala che è stato scritto con tutto come pubblico. Il codice di ogni classe potrebbe essere semplice ... ma le loro relazioni e l'architettura risultante finiscono per essere un incubo da mantenere.

+0

È vero che molte delle cose che fanno sono legate al sito web ... contengono un sacco di codice javascript. Quindi è probabilmente per questo che lo usano anche in java/android. – WereWolfBoy

0

Penso che dipenda. Ad esempio: se usi getter, puoi sovrascriverlo. A volte è molto utile.