Significato dell'utilizzo di getter e setter e Usi del Costruttore parametrizzato. [duplicare]

0

Sto usando getter e setter allo scopo di incapsulare.

public class Student {

    private String studentID;
    private String studentName;
    private String address;

    public Student(){
        //default constructor
    }

    public Student(String studentID, String studentName, String address) {
        super();
        this.studentID = studentID;
        this.studentName = studentName;
        this.address = address;
    }

    public String getStudentID() {
        return studentID;
    }

    public void setStudentID(String studentID) {
        this.studentID = studentID;
    }

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

le variabili studentID, studentName e indirizzo sono dichiarati come privati, con l'intenzione di incapsulare.

ma potremmo anche fare lo stesso compito rendendo il livello di accessibilità variabile da privato a pubblico, è davvero utile applicare l'incapsulamento con l'uso di setter e getter?

solo io riesco a capire l'uso di getter e setter: gli utenti della classe non devono avere un'idea dei nomi delle variabili usate nella classe come setter e getter hanno un senso per gli utenti della classe

ex- objectofStudentClass.setStudentID ("S0001");

C'è una differenza tra la differenza principale tra la creazione di getter e setter invece se si rende pubblico il livello di accesso variabile.

Domanda 2: anche qui ho reso il costruttore parametrizzato corrispondente alle variabili / campi nella classe Student. è questo che butta via il concetto di incapsulamento?

    
posta Roovi D 06.10.2015 - 09:58
fonte

2 risposte

1

Sì, c'è un'enorme differenza.

Avere getter e setter ti consente di modificare la loro implementazione (ad esempio, per aggiungere il controllo di intervallo, la registrazione di controllo, gli aggiornamenti delle statistiche ecc.) in futuro senza dover modificare tutto il codice client . Avere una variabile pubblica renderebbe tale manutenzione un cambiamento decisivo. Molto spesso questa è la differenza tra un cambiamento che è fattibile ed è troppo invasivo / rischioso da eseguire.

    
risposta data 06.10.2015 - 10:01
fonte
1

La prima cosa da notare è che i getter e i setter pubblici non forniscono l'incapsulamento:

[…] getters and setters do not achieve encapsulation or information hiding: they are a language-legitimized way to violate them.

James O. Coplien & Gertrud Bjørnvig. Lean Architecture. Wiley. 2010. p. 134.

Quindi la risposta alla tua domanda se c'è una differenza tra loro e il solo avere un campo pubblico è: non c'è differenza per quanto riguarda l'incapsulamento.

Ciò che forniscono sono però il supporto per il principio Open-closed. È possibile modificare in seguito il comportamento di getter e setter, per aggiungere una causa di guardia, ad esempio, senza modificare l'API. Questo però porta a un altro percorso potenzialmente negativo, poiché ogni getter / setter che non ottiene / imposta un campo rischia di rompere il POLA principio.

La domanda finale ti porta al modo "corretto" di usare i getter: usa un costruttore per impostare i campi e fornire solo getter. Ciò fornisce un vero incapsulamento e consente ai tuoi campi di essere invarianti, il che migliora la sicurezza del thread.

    
risposta data 06.10.2015 - 11:38
fonte

Leggi altre domande sui tag