Perché non dovrei usare variabili pubbliche nella mia classe Java? [duplicare]

12

A scuola, mi è stato detto più volte di smettere di usare public per le mie variabili. Non ho ancora chiesto il perché.

Questa domanda: I campi pubblici di Java sono solo un tragico difetto del design storico a questo punto? sembra un po 'collegato a questo. Tuttavia, non sembrano discutere perché è "sbagliato", ma si concentrano invece su come possono invece usarli.

Guarda questa classe (incompleta):

public class Reporte {

    public String rutaOriginal;
    public String rutaNueva;
    public int bytesOriginales;
    public int bytesFinales;
    public float ganancia;

    /**
     * Constructor para objetos de la clase Reporte
     */
    public Reporte() {

    }
}

Non c'è bisogno di capire lo spagnolo. Tutto ciò che fa questa classe è contenere alcune statistiche (quei campi pubblici) e poi fare alcune operazioni con loro (più tardi).

Dovrò anche modificare queste variabili spesso. Ma bene, dato che mi è stato detto di non usare public , questo è quello che ho finito per fare:

public class Reporte {

    private String rutaOriginal;
    private String rutaNueva;
    private int bytesOriginales;
    private int bytesFinales;
    private float ganancia;

    /**
     * Constructor para objetos de la clase Reporte
     */
    public Reporte() {

    }

    public String getRutaOriginal() {
        return rutaOriginal;
    }

    public String getRutaNueva() {
        return rutaNueva;
    }

    public int getBytesOriginales() {
        return bytesOriginales;
    }

    public int getBytesFinales() {
        return bytesFinales;
    }

    public float getGanancia() {
        return ganancia;
    }

    public void setRutaOriginal(String rutaOriginal) {
        this.rutaOriginal = rutaOriginal;
    }

    public void setRutaNueva(String rutaNueva) {
        this.rutaNueva = rutaNueva;
    }

    public void setBytesOriginales(int bytesOriginales) {
        this.bytesOriginales = bytesOriginales;
    }

    public void setBytesFinales(int bytesFinales) {
        this.bytesFinales = bytesFinales;
    }

    public void setGanancia(float ganancia) {
        this.ganancia = ganancia;
    }
}

Sembra abbastanza carina. Ma sembra una perdita di tempo.

Le ricerche di Google su "Quando utilizzare public in Java" e "Perché non dovrei usare public in Java" sembrano discutere di un concetto di mutevolezza , anche se non sono davvero sicuro di come interpretare tali discussioni. Voglio che la mia classe sia mutabile - sempre.

    
posta Omega 23.11.2012 - 02:03
fonte

2 risposte

24

Interrompe l'incapsulamento - il principio fondamentale qui è che i campi della tua classe sono dettagli di implementazione, esponendolo come un campo pubblico, stai dicendo a qualsiasi cosa al di fuori di quella classe che si tratta di un vero e proprio pezzo di dati che viene archiviato dal classe - qualcosa che le classi esterne non hanno bisogno di sapere, hanno solo bisogno di essere in grado di ottenere o impostare quella parte di dati. Non appena rendi pubblico qualcosa, le classi esterne dovrebbero poter dipendere da esso, e non dovrebbe cambiare spesso, implementando come metodo, stai mantenendo la flessibilità di cambiare l'implementazione in un secondo momento senza influire sugli utenti della classe .

Se si desidera modificare uno dei campi in modo che sia calcolato, o recuperato da un servizio quando è chiamato, non si sarebbe in grado di interrompere senza rompere altre parti della propria applicazione. Altri motivi sono che ti permette di controllare l'accesso alla variabile (cioè renderla immutabile come hai già evidenziato). Nei setter puoi anche aggiungere il codice di controllo, e puoi aggiungere comportamenti a getter e setter che fanno altre cose quando una variabile viene presa o impostata (anche se questo potrebbe non essere sempre una buona cosa). Puoi anche eseguire l'override di un metodo in una classe derivata, non puoi sovrascrivere un campo.

Ci sono alcune situazioni molto rare in cui è meglio avere un campo pubblico invece di un metodo - ma questo si applica solo in applicazioni ad altissime prestazioni (giochi 3D e applicazioni di trading finanziario), a meno che stai scrivendo uno di questi, evita i campi pubblici e, se ti interessi delle prestazioni a quel livello, probabilmente Java non è la scelta migliore.

Solo una nota sulla mutabilità - in generale dovresti cercare di rendere le cose immutabili finché non hai una vera ragione per renderle mutevoli - meno il tuo codice espone nella sua API pubblica, più è facile per la manutenzione a lungo termine e in una situazione multi-thread, gli oggetti immutabili sono thread-safe, gli oggetti mutabili devono implementare il blocco.

    
risposta data 23.11.2012 - 02:39
fonte
8

L'incapsulamento è uno dei quattro concetti OOP fondamentali. Gli altri tre sono ereditarietà, polimorfismo e astrazione.

L'incapsulamento è la tecnica per rendere privati i campi di una classe e fornire l'accesso ai campi tramite metodi pubblici. Se un campo è dichiarato privato, non è accessibile a nessuno al di fuori della classe, nascondendo quindi i campi all'interno della classe. Per questo motivo, l'incapsulamento viene anche definito come occultamento dei dati.

L'incapsulamento può essere descritto come una barriera protettiva che impedisce al codice e ai dati di accedere in modo casuale a un altro codice definito al di fuori della classe. L'accesso ai dati e al codice è strettamente controllato da un'interfaccia.

Il vantaggio principale dell'incapsulamento è la possibilità di modificare il codice implementato senza violare il codice di altri utenti che utilizzano il nostro codice. Con questa funzione Encapsulation offre manutenibilità, flessibilità ed estensibilità al nostro codice. Vantaggi dell'incapsulamento:

I campi di una classe possono essere resi di sola lettura o di sola scrittura.

Una classe può avere il controllo totale su ciò che è memorizzato nei suoi campi.

Gli utenti di una classe non sanno come la classe memorizza i suoi dati. Una classe può modificare il tipo di dati di un campo e gli utenti della classe non devono modificare alcun codice. I metodi pubblici sono i punti di accesso ai campi di questa classe dal mondo java esterno. Normalmente questi metodi sono indicati come getter e setter. Pertanto qualsiasi classe che voglia accedere alle variabili dovrebbe accedervi tramite questi getter e setter.

    
risposta data 23.11.2012 - 08:29
fonte

Leggi altre domande sui tag