Zašto je niz nepromjenjiv u Javi?

1. Uvod

U Javi su žice nepromjenjive. Očito pitanje koje je prilično često u intervjuima je "Zašto su žice dizajnirane kao nepromjenjive u Javi?"

Jamesa Goslinga, tvorca Jave, jednom su u jednom intervjuu pitali kada treba koristiti nepromjenjive vrijednosti, na što on odgovara:

Koristio bih nepromjenjivu kad god mogu.

Dalje podupire svoj argument navodeći značajke koje pruža nepromjenjivost, poput predmemoriranja, sigurnosti, jednostavne ponovne upotrebe bez replikacije itd.

U ovom uputstvu dalje ćemo istražiti zašto su se dizajneri jezika Java odlučili zadržati Niz nepromjenjiv.

2. Što je nepromjenjivi objekt?

Nepromjenjivi objekt je objekt čije unutarnje stanje ostaje konstantno nakon što je u cijelosti stvoreno. To znači da nakon što je objekt dodijeljen varijabli, ne možemo ni na koji način ažurirati referencu niti mutirati unutarnje stanje.

Imamo zasebni članak koji detaljno govori o nepromjenjivim objektima. Za više informacija pročitajte članak Nepromjenjivi objekti u Javi.

3. Zašto je Niz Nepromjenjiv u Javi?

Ključne prednosti zadržavanja ove klase kao nepromjenjive su predmemoriranje, sigurnost, sinkronizacija i performanse.

Razgovarajmo kako ove stvari funkcioniraju.

3.1. Uvesti u Niz Bazen

The Niz je najčešće korištena struktura podataka. Predmemoriranje Niz i njihova ponovna upotreba štedi puno prostora na hrpi jer su različiti Niz varijable se odnose na isti objekt u Niz bazen. Niz interni bazen služi upravo u tu svrhu.

Java String Pool je posebna memorijska regija gdje Žice pohranjuje JVM. Od Žice su nepromjenjivi u Javi, JVM optimizira količinu memorije koja im je dodijeljena spremajući samo jednu kopiju svakog doslovnog Niz u bazenu. Taj se postupak naziva interniranje:

Niz s1 = "Pozdrav svijetu"; Niz s2 = "Pozdrav svijetu"; assertThat (s1 == s2) .isTrue ();

Zbog prisutnosti Niz pool u prethodnom primjeru, dvije različite varijable ukazuju na iste Niz objekt iz spremišta, štedeći tako ključne memorijske resurse.

Imamo zasebni članak posvećen Javi Niz Bazen. Za više informacija prijeđite na taj članak.

3.2. Sigurnost

The Niz široko se koristi u Java aplikacijama za pohranu osjetljivih podataka poput korisničkih imena, lozinki, URL-ova veza, mrežnih veza itd. Također ga uvelike koriste utovarivači klasa JVM tijekom učitavanja klasa.

Stoga osiguravanje Niz klasa presudna je za sigurnost cjelokupne aplikacije uopće. Na primjer, razmotrite ovaj jednostavni isječak koda:

void kritičnaMetoda (niz userName) {// izvršava sigurnosne provjere if (! isAlphaNumeric (userName)) {throw new SecurityException (); } // // izvršiti neke sekundarne zadatke initializeDatabase (); // povezivanje kritičnog zadatka.executeUpdate ("AŽURIRANJE Korisničkih postavki SET Status = 'Active'" + "WHERE UserName = '" + userName + "'"); }

U gornjem isječku koda recimo da smo dobili Niz objekt iz nepovjerljivog izvora. U početku radimo sve potrebne sigurnosne provjere kako bismo provjerili je li Niz je samo alfanumerički, nakon čega slijede još neke operacije.

Imajte na umu da se naša nepouzdana metoda poziva pozivatelja još uvijek poziva na to Korisničko ime objekt.

Ako Žice bili promjenjivi, pa dok izvršimo ažuriranje, ne možemo biti sigurni da je Niz koju smo dobili, čak i nakon što smo izvršili sigurnosne provjere, bili bi sigurni. Nepouzdana metoda pozivatelja i dalje ima referencu i može promijeniti Niz između provjera integriteta. Stoga naš upit postaje sklonim ubrizgavanju SQL-a u ovom slučaju. Tako promjenjivo Žice mogao s vremenom dovesti do degradacije sigurnosti.

Također se može dogoditi da NizKorisničko ime je vidljiv drugoj niti, koja bi mogla promijeniti vrijednost nakon provjere integriteta.

Općenito, nepromjenjivost nam dolazi u pomoć u ovom slučaju jer je lakše raditi s osjetljivim kodom kad se vrijednosti ne mijenjaju jer je manje isprepletanja operacija koje bi mogle utjecati na rezultat.

3.3. Sinkronizacija

Budući da je nepromjenjiv automatski čini Niz nit siguran jer se neće mijenjati ako im se pristupi iz više niti.

Stoga nepromjenjivi objekti, općenito, mogu se dijeliti kroz više niti koje se istodobno izvode. Oni su također sigurni za konac jer ako nit mijenja vrijednost, umjesto da mijenja istu, nova Niz bi se stvorio u Niz bazen. Stoga, Žice su sigurni za više navoja.

3.4. Hashcode predmemoriranje

Od Niz objekti se obilno koriste kao struktura podataka, također se široko koriste u hash implementacijama poput HashMap, HashTable, HashSetitd. Kada operirate ovim implementacijama raspršivanja, hashCode () metoda naziva se prilično često za skupljanje.

Jamstvo nepromjenjivosti Žice da se njihova vrijednost neće promijeniti. Tako the hashCode () metoda je nadjačana u Niz klasa za olakšavanje predmemoriranja, tako da se hash izračunava i predmemorira tijekom prvog hashCode () poziva i od tada se vraća ista vrijednost.

To, pak, poboljšava izvedbu zbirki koje koriste implementaciju raspršivanja kada se s njima radi Niz predmeta.

S druge strane, promjenjivo Žice proizveo bi dva različita hashkodova u vrijeme umetanja i dohvaćanja ako je sadržaj Niz je modificiran nakon operacije, potencijalno gubeći objekt vrijednosti u Karta.

3.5. Izvođenje

Kao što smo ranije vidjeli, Niz bazen postoji jer Žice su nepromjenjive. Zauzvrat, poboljšava performanse štedeći hrpu memorije i brži pristup implementacijama raspršivanja kada se radi s njima Žice.

Od Niz je najčešće korištena struktura podataka, poboljšavajući performanse Niz imaju značajan učinak na poboljšanje izvedbe cijele aplikacije općenito.

4. Zaključak

Kroz ovaj članak to možemo zaključiti Nizovi su nepromjenjivi upravo tako da se njihove reference mogu tretirati kao normalna varijabla i može ih se prosljeđivati, između metoda i preko niti, bez brige o tome je li stvarna Niz objekt na koji upućuje promijenit će se.

Također smo saznali koji bi mogli biti drugi razlozi koji su potaknuli Java jezični dizajneri da ovu klasu učine nepromjenjivom.