2011-12-07 7 views

risposta

11

In primo luogo, si deve sapere che quando si scrive:

class Person(val name: String, val age: Int) { 
    ... 
} 

name e age non sono variabili di istanza, ma accessor metodi getter(), che sono pubbliche per impostazione predefinita.

se si scrive invece:

class Person(name: String, age: Int) { 
    ... 
} 

name e age sono solo le variabili di istanza, che sono private, come ci si può aspettare.

La filosofia di Scala è preferire variabili di istanza immutabili, quindi i metodi di accesso pubblico non sono più un problema.

+3

Nel secondo esempio, 'name' e' age' potrebbero anche essere solo parametri del costruttore e non variabili di istanza, a seconda di come vengono utilizzati nel corpo di 'Persona'. –

+0

Sì hai ragione, non volevo complicare la risposta. – paradigmatic

5

Privato incoraggia monoliti. Non appena è più semplice inserire funzionalità non correlate in una classe solo perché è necessario leggere alcune variabili che risultano private, le classi iniziano a crescere.

È solo un difetto predefinito e uno dei motivi principali per le classi con più di 1000 righe in Java.

Scala predefinito immutabile, che rimuove un'enorme classe di errori che le persone utilizzano spesso private per limitare (ma non rimuovere, in quanto i metodi propri della classe possono ancora mutare le variabili) in Java.

3
  1. con immutabili che sono preferiti in molti luoghi, pubblico non è tanto di un problema di
  2. è possibile sostituire una val pubblico con getter e setter senza modificare il codice del client, pertanto non è necessario il ulteriore strato di getter e setter nel caso in cui ne hai bisogno. (In realtà si vuole ricevere quello strato, ma non si nota che la maggior parte del tempo.)
  3. java contro modello di campo privato + setter pubblici e getter non incapsulare molto comunque
3

(Un ulteriore visualizzare l'integrazione delle altre risposte :)

Uno dei principali driver dietro l'incapsulamento dei campi di Java era la politica di accesso uniforme, ovvero non si doveva sapere o importare se qualcosa fosse implementato semplicemente come campo o calcolato con un metodo su il volo. Il grosso vantaggio di questo è che il manutentore della classe in questione potrebbe passare tra i due come richiesto, senza che sia necessario modificare altre classi.

In Java, questo richiedeva che tutto fosse accessibile tramite un metodo, al fine di fornire la flessibilità sintattica per calcolare un valore se necessario.

In Scala, è possibile accedere a metodi e campi tramite sintassi equivalente, quindi se si dispone di una proprietà semplice ora, non c'è perdita nell'incapsulamento per esporlo direttamente, poiché è possibile scegliere di esporlo come metodo no-arg più tardi senza che i chiamanti debbano sapere qualcosa del cambiamento.

Problemi correlati