logo

מדוע מחרוזת היא בלתי ניתנת לשינוי או סופית ב-Java

בתכנות מונחה עצמים, ה מחרוזת או אובייקטים בלתי ניתנים לשינוי שלא ניתן לשנות לאחר יצירתו. אבל אנחנו יכולים לשנות רק את ההתייחסות לאובייקט. אנו מגבילים לשנות את האובייקט עצמו. ה המחרוזת אינה ניתנת לשינוי ב Java בגלל האבטחה, הסנכרון והמקבילות, השמירה במטמון וטעינת המחלקה. הסיבה להפיכת המיתר לגמר היא להרוס את הבלתי משתנה ולא לאפשר לאחרים להאריך אותה.

אובייקטי ה-String מאוחסנים במטמון ב-String pool, והוא הופך את מחרוזת בלתי ניתנת לשינוי . לקוחות מרובים ניגשים אל מילות המטמון של המחרוזות. לכן, תמיד קיים סיכון, כאשר פעולה שמבצעת לקוח אחד משפיעה על כל שאר הלקוחות. לדוגמה, אם לקוח אחד מבצע פעולה ומשנה את ערך המחרוזת מ-Pressure ל-PRESSURE, כל הלקוחות הנותרים יקראו גם את הערך הזה. מטעמי הביצועים, שמירה במטמון של אובייקטי String היה חשוב, אז כדי להסיר את הסיכון הזה, עלינו להפוך את המחרוזת לבלתי ניתנת לשינוי.

מדוע מחרוזת היא בלתי ניתנת לשינוי או סופית ב-Java

אלו עוד כמה סיבות להפיכת מחרוזת לבלתי משתנה:

  • מאגר המחרוזות לא יכול להיות אפשרי אם String אינו ניתן לשינוי ב-Java. הרבה מקום ערימה נחסך על ידי JRE . ניתן להתייחס לאותו משתנה מחרוזת על ידי יותר ממשתנה מחרוזת אחד במאגר. התמחות מחרוזת גם לא יכולה להיות אפשרית אם המחרוזת אינה ניתנת לשינוי.
  • אם לא נהפוך את המחרוזת לבלתי ניתנת לשינוי, היא תהווה איום אבטחה רציני על האפליקציה. לדוגמה, שמות משתמש של מסד נתונים, סיסמאות מועברות כמחרוזות לקבלת חיבורי מסד נתונים. ה תכנות שקעים תיאורי מארח ויציאה מועברים גם כמחרוזות. המחרוזת אינה ניתנת לשינוי, כך שלא ניתן לשנות את הערך שלה. אם המחרוזת אינה ניתנת לשינוי, כל האקר יכול לגרום לבעיית אבטחה באפליקציה על ידי שינוי ערך הייחוס.
  • המחרוזת בטוחה לריבוי השחלות בגלל אי-השינוי שלה. שרשורים שונים יכולים לגשת ל'מופע מחרוזת' בודד. זה מסיר את הסנכרון לבטיחות חוטים מכיוון שאנו הופכים את המחרוזות לבטוחות בחוט באופן מרומז.
  • חוסר שינוי נותן את האבטחה של טעינת המחלקה הנכונה על ידי Classloader. לדוגמה, נניח שיש לנו מופע שבו אנחנו מנסים לטעון את המחלקה java.sql.Connection אבל השינויים בערך המיועד למחלקה myhacked.Connection עושה דברים לא רצויים למסד הנתונים שלנו.

בואו נבין את המושג בלתי משתנה באמצעות דוגמה.

ImmutableString.java

 import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString.concat('World'); System.out.println(NewString); } } 

תְפוּקָה:

מדוע מחרוזת היא בלתי ניתנת לשינוי או סופית ב-Java

תיאור: אנו יכולים להבין את הדוגמה לעיל בעזרת התרשים הבא:

מדוע מחרוזת היא בלתי ניתנת לשינוי או סופית ב-Java

בבריכה קבועה המיתר, ה שלום נשאר ללא שינוי, ואובייקט מחרוזת חדש נוצר עם שלום עולם . זה מראה שהמיתרים בלתי ניתנים לשינוי. משתנה ההתייחסות מצביע על שלום לא ל שלום עולם.

אם אנחנו רוצים את זה זה מתייחס ל שלום עולם , עלינו להקצות אותו במפורש למשתנה זה. לדוגמה:

 import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString = NewString.concat('World'); System.out.println(NewString); } } 

תְפוּקָה:

מדוע מחרוזת היא בלתי ניתנת לשינוי או סופית ב-Java