În programarea orientată pe obiecte, șir sau obiecte imuabile care nu poate fi modificat odată ce este creat. Dar putem schimba doar referința la obiect. Ne limităm la schimbarea obiectului în sine. The Șirul este imuabil în Java din cauza securității, sincronizării și concurenței, caching-ului și încărcării claselor. Motivul finalizării șirului este acela de a distruge imuabilitatea și de a nu permite altora să o extindă.
Obiectele String sunt stocate în cache în pool-ul String și face ca String imuabil . Literalele șiruri din cache sunt accesate de mai mulți clienți. Deci, există întotdeauna un risc, în care acțiunea efectuată de un client îi afectează pe toți ceilalți clienți. De exemplu, dacă un client efectuează o acțiune și modifică valoarea șirului de la Presiune la PRESIUNE, toți clienții rămași vor citi și acea valoare. Din motive de performanță, stocarea în cache a obiectelor String a fost importantă, așa că pentru a elimina acest risc, trebuie să facem String-ul imuabil.
variabilă java variabilă
Acestea sunt alte motive pentru a face String imuabil:
- Pool-ul String nu poate fi posibil dacă String nu este imuabil în Java. Se economisește mult spațiu în heap JRE . Aceeași variabilă șir poate fi menționată de mai multe variabile șir din pool. Internarea șirurilor nu poate fi, de asemenea, posibilă dacă șirul nu ar fi imuabil.
- Dacă nu facem String-ul imuabil, va reprezenta o amenințare serioasă de securitate pentru aplicație. De exemplu, numele de utilizator al bazei de date, parolele sunt transmise ca șiruri de caractere pentru a primi conexiuni la baza de date. The programarea prizei descrierile de gazdă și porturi sunt, de asemenea, transmise ca șiruri. String-ul este imuabil, deci valoarea sa nu poate fi schimbată. Dacă șirul nu rămâne imuabil, orice hacker poate cauza o problemă de securitate în aplicație prin modificarea valorii de referință.
- String-ul este sigur pentru multithreading datorită imuabilității sale. Diferite fire pot accesa o singură „instanță String”. Îndepărtează sincronizarea pentru siguranța firelor, deoarece facem implicit șirurile sigure pentru fire.
- Imuabilitatea oferă securitatea încărcării clasei corecte de către Classloader. De exemplu, să presupunem că avem o instanță în care încercăm să încărcăm clasa java.sql.Connection, dar modificările valorii de referință în clasa myhacked.Connection fac lucruri nedorite în baza noastră de date.
Să înțelegem conceptul de imuabil printr-un exemplu.
ImmutableString.java
import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString.concat('World'); System.out.println(NewString); } }
Ieșire:
Descriere: Putem înțelege exemplul de mai sus cu ajutorul diagramei următoare:
egalitatea obiectelor java
În pool-ul constant de șir, the Buna ziua rămâne neschimbat și un nou obiect șir este creat cu Salut Lume . Arată că șirurile sunt imuabile. Variabila de referință indică Buna ziua nu la Salut Lume.
Dacă vrem că se referă la Salut Lume , trebuie să-l atribuim în mod explicit acelei variabile. De exemplu:
import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString = NewString.concat('World'); System.out.println(NewString); } }
Ieșire: