Encapsulation ehk kapseldamine
Encapsulation ehk kapseldamine on üks OOP'i põhikontseptsioonidest, Javas kujutab see endast muutujate ning neid kasutava koodi sidumist ühtseks tervikuks. Kapseldamise korral peidetakse klassi välju teiste klasside eest, nendele muutujatele pääsetakse ligi ainult läbi meetodite, mis on väljadega samas klassis. Kapseldamine aitab vältida valede muutujate kasutamist, muutes väljadele ligipääsemise teadlikuks ning kontrollitud tegevuseks.
Kapseldamiseks on vaja:
Anda klassis olevatele väljadele private nähtavus
Luua väljade muutmiseks getter ja setter meetodid
Getter ning Setter meetodid
Getter meetodit kasutatakse klassis oleva välja väärtuse teada saamiseks, seega ei võta getter meetod endale sisendeid ning tagastab muutuja väärtuse. Getter meetod on public nähtavusega, mis tähendab, et klassis olevale väljale on vaatamata private nähtavusele võimalik ligi pääseda ka teistest klassidest. Getter meetodite nimeks on get + VäljaNimi + (), erandiks on boolean väärtused, millel on getter'ite asemel nende olekut küsivad meetodid, mille nimetused on kujul is + BooleanMuutujaNimi + ().
Setter meetod on mõeldud klassis olevate private väljade väärtuste muutmiseks, selle sisendiks on uus väärtus, mida soovitakse muutujale anda. Setter'id on void meetodid, mis tähendab et nad ei tagasta midagi. Setter meetodeid nimetatakse järgnevalt: set + VäljaNimi + ().
Selleks, et ei peaks palju vaeva nägema selle nimel, et luua getter ning setter meetodeid, pakub näiteks IntelliJ mugavat võimalust enda loodud klassiväljadele automaatselt vastavad meetodid genereerida. Tarvis on ainult teha paremklikk väljal, millele soovitakse genereerida meetodeid, valida avanenud menüüst Generate... ning otsustada, kas genereerida Getter, Setter või suisa mõlemad korraga.
public class EncapsulationExample {
// All of these fields have private visibility
private int number;
private boolean state = false;
private ArrayList<Integer> list;
public ArrayList<Integer> getList() {
//returns the field variable
return list;
}
public void setList(ArrayList<Integer> list) {
// The word this refers to the current class
// in this instance EncapsulationExample
this.list = list;
}
public boolean isState() {
return state;
}
public void setState(boolean state) {
this.state = state;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public static void main(String[] args) {
// Getter and setter methods can be used in other classes
EncapsulationExample example = new EncapsulationExample();
// Returns 0 because number doesn't have a value yet
System.out.println(example.getNumber());
// This setter gives a value to the variable number
example.setNumber(666);
// Returns false, since it already has a set value
System.out.println(example.isState());
// Changes the value of state to true
example.setState(true);
// Now this getter returns true
System.out.println(example.isState());
// Creates a new ArrayList object
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6));
// Getter and Setter methods can be used with any type of objects
example.setList(list);
// Returns [1, 2, 3, 4, 5, 6]
System.out.println(example.getList().toString());
}
}
See koodinäide tagastab:
0
false
true
[1, 2, 3, 4, 5, 6]