V objektově orientovaném programování, neměnný řetězec nebo předměty které po vytvoření nelze upravit. Ale můžeme změnit pouze odkaz na objekt. Omezujeme na změnu samotného objektu. The Řetězec je neměnný v Jáva kvůli zabezpečení, synchronizaci a souběžnosti, ukládání do mezipaměti a načítání tříd. Důvodem definitivní struny je zničit neměnnost a nedovolit ostatním, aby ji prodlužovali.
Objekty String jsou ukládány do mezipaměti ve fondu String a to vytváří Řetězec neměnný . Řetězcové literály uložené v mezipaměti jsou přístupné více klientům. Vždy tedy existuje riziko, kdy akce provedená jedním klientem ovlivní všechny ostatní klienty. Pokud například jeden klient provede akci a změní hodnotu řetězce z Pressure (Tlak) na PRESSURE (Tlak), přečtou tuto hodnotu také všichni zbývající klienti. Z důvodu výkonu bylo ukládání objektů String do mezipaměti důležité, takže abychom toto riziko odstranili, musíme vytvořit String Immutable.
Toto jsou některé další důvody, proč je řetězec neměnný:
- Fond řetězců nemůže být možný, pokud řetězec není v Javě neměnný. Tím se ušetří spousta místa na hromadě JRE . Na stejnou řetězcovou proměnnou může odkazovat více než jedna řetězcová proměnná ve fondu. Vložení řetězce také nemůže být možné, pokud by řetězec nebyl neměnný.
- Pokud neuděláme řetězec neměnný, bude to představovat vážnou bezpečnostní hrozbu pro aplikaci. Například databázová uživatelská jména, hesla jsou předávána jako řetězce pro příjem databázových připojení. The programování zásuvky popisy hostitele a portu jsou také předány jako řetězce. Řetězec je neměnný, takže jeho hodnotu nelze změnit. Pokud řetězec nezůstane neměnný, může kterýkoli hacker způsobit bezpečnostní problém v aplikaci změnou referenční hodnoty.
- Řetězec je bezpečný pro multithreading kvůli jeho neměnnosti. Různá vlákna mohou přistupovat k jedné „instanci řetězce“. Odstraňuje synchronizaci pro bezpečnost vláken, protože implicitně vytváříme řetězce bezpečné pro vlákna.
- Immutability poskytuje jistotu načtení správné třídy pomocí Classloaderu. Předpokládejme například, že máme instanci, kde se pokoušíme načíst třídu java.sql.Connection, ale změny v odkazované hodnotě na třídu myhacked.Connection způsobí v naší databázi nežádoucí věci.
Pojďme pochopit koncept neměnného na příkladu.
ImmutableString.java
import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString.concat('World'); System.out.println(NewString); } }
Výstup:
Popis: Výše uvedený příklad můžeme pochopit pomocí následujícího diagramu:
Ve fondu konstant řetězců je Ahoj zůstane nezměněn a vytvoří se nový objekt řetězce s Ahoj světe . Ukazuje, že řetězce jsou neměnné. Referenční proměnná ukazuje na Ahoj ne k Ahoj světe.
Pokud chceme, aby se odkazovalo na Ahoj světe , musíme ji explicitně přiřadit k této proměnné. Například:
import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString = NewString.concat('World'); System.out.println(NewString); } }
Výstup: