Nepromjenjivi objekti u Javi

1. Pregled

U ovom uputstvu naučit ćemo što objekt čini nepromjenjivim, kako postići nepromjenjivost u Javi i koje prednosti dolaze s tim.

2. Što je nepromjenjivi objekt?

Nepromjenjivi objekt je objekt čije unutarnje stanje ostaje konstantno nakon što je u cijelosti stvoreno.

To znači da nam javni API nepromjenjivog objekta jamči da će se ponašati na isti način tijekom cijelog svog života.

Ako bacimo pogled na razred Niz, možemo vidjeti da čak i kad nam se čini da nam njegov API pruža promjenjivo ponašanje zamijeniti metoda, izvornik Niz ne mijenja se:

Naziv niza = "baeldung"; Niz newName = name.replace ("balega", "----"); assertEquals ("baeldung", ime); assertEquals ("bael ----", newName);

API nam daje metode samo za čitanje, on nikada ne smije uključivati ​​metode koje mijenjaju unutarnje stanje objekta.

3. The konačni Ključna riječ u Javi

Prije pokušaja postizanja nepromjenjivosti u Javi, trebali bismo razgovarati o konačni ključna riječ.

U Javi, varijable su prema zadanim postavkama promjenjive, što znači da možemo promijeniti vrijednost koju imaju.

Korištenjem konačni pri deklariranju varijable Java kompajler ne dopušta nam da promijenimo vrijednost te varijable. Umjesto toga, prijavit će pogrešku u vremenu prevođenja:

konačni naziv niza = "baeldung"; name = "bael ...";

Imajte na umu da konačni samo nam zabranjuje promjenu reference koju sadrži varijabla, ne štiti nas od promjene unutarnjeg stanja objekta na koji se odnosi pomoću njegovog javnog API-ja:

konačni nizovi popisa = novi ArrayList (); assertEquals (0, strings.size ()); strings.add ("baeldung"); assertEquals (0, strings.size ());

Drugi assertEquals neće uspjeti jer dodavanje elementa na popis mijenja njegovu veličinu, stoga nije nepromjenjivi objekt.

4. Nepromjenjivost u Javi

Sad kad znamo kako izbjeći promjene u sadržaju varijable, možemo je koristiti za izgradnju API-ja nepromjenjivih objekata.

Izgradnja API-ja nepromjenjivog objekta zahtijeva da jamčimo da se njegovo unutarnje stanje neće promijeniti bez obzira na to kako koristimo njegov API.

Korak naprijed u pravom smjeru je korištenje konačni prilikom deklariranja svojih atributa:

klasa Novac {privatni konačni dvostruki iznos; privatna konačna valuta valute; // ...}

Imajte na umu da nam Java jamči da vrijednost iznos neće se promijeniti, to je slučaj sa svim primitivnim varijablama tipa.

Međutim, u našem primjeru zajamčeno nam je samo da valuta neće se promijeniti, pa moramo se osloniti na Valuta API za zaštitu od promjena.

Većinu vremena atributi objekta trebaju nam da bi sadržavali prilagođene vrijednosti, a mjesto za inicijalizaciju unutarnjeg stanja nepromjenjivog objekta je njegov konstruktor:

klasa Novac {// ... javni novac (dvostruki iznos, valuta valute) {this.amount = iznos; this.currency = currency; } javna valuta getCurrency () {povratna valuta; } javni dvostruki getAmount () {povratni iznos; }}

Kao što smo već rekli, da bismo udovoljili zahtjevima nepromjenjivog API-ja, naš Novac razred ima samo metode samo za čitanje.

Korištenjem API-ja za refleksiju možemo razbiti nepromjenjivost i promijeniti nepromjenjive objekte. Međutim, refleksija krši javni API nepromjenjivog objekta i obično bismo to trebali izbjegavati.

5. Prednosti

Budući da unutarnje stanje nepromjenjivog predmeta ostaje konstantno u vremenu, možemo ga sigurno podijeliti među više niti.

Možemo ga koristiti i slobodno, a niti jedan od objekata koji ga upućuju neće primijetiti nikakvu razliku, možemo to reći nepromjenjivi predmeti nemaju nuspojave.

6. Zaključak

Nepromjenjivi objekti ne mijenjaju svoje unutarnje stanje na vrijeme, oni su sigurni u nitima i bez nuspojava. Zbog tih svojstava nepromjenjivi su objekti također posebno korisni kada se radi s okruženjima s više niti.

Primjere korištene u ovom članku možete pronaći na GitHubu.