Java Developer | digipay
Mutable VS Immutable in java
کدام یک از collection ها در جاوا mutable و کدام یک immutable است؟

در این مقاله فرض میکنیم که شما اطلاعات حدودی از Java Collections دارید.
این سلسله مقالات که برای تکمیل مقاله Java Collections - Everything You MUST Know نوشته شده برای بهبود و درک بهتر collectionها و مواردی که به طور روزمره دارید استفاده میکنید نوشته شده لطفا تمام این دسته بندی رو برای درک بهتر مطالعه کنید .
StringBuilder vs StringBuffer vs String
قابلیت تغییر (Mutability) در مجموعههای جاوا
در جاوا، مجموعهها (Collections) به دو دسته اصلی قابل تغییر (Mutable) و غیرقابل تغییر (Immutable) تقسیم میشوند. این تقسیمبندی بر اساس امکان تغییر محتویات مجموعه پس از ایجاد آن صورت میگیرد.
مجموعههای قابل تغییر (Mutable Collections)
مجموعههای قابل تغییر به شما اجازه میدهند پس از ایجاد، عناصر را به آنها اضافه، حذف یا تغییر دهید. این ویژگی در بسیاری از سناریوها بسیار مفید است، اما باید با احتیاط استفاده شود، زیرا تغییرات در یک مجموعه میتواند بر روی قسمتهای دیگر برنامه نیز تأثیر بگذارد.
به طور معمول، متدی برای ویرایش مقدار فیلد در خود دارد، و object می تواند گسترش پیدا کند.
مثالهایی از مجموعههای قابل تغییر:
- List: ArrayList، LinkedList
- Set: HashSet، TreeSet
- Map: HashMap، TreeMap
چرا از مجموعههای قابل تغییر استفاده میکنیم؟
- انعطافپذیری: توانایی تغییر محتویات مجموعه در طول اجرای برنامه
- کارایی: در بسیاری از عملیات، مجموعههای قابل تغییر کارایی بالاتری دارند
مثال :
public class MutableExample {
private String name;
MutableClass(String name) {
this.name = name;
}
public String getName() {
return name;
}
// this setter can modify the name
public void setName(String name) {
this.name = name;
}
public static voidmain(String[] args) {
MutableExample obj =newMutableExample("test");
System.out.println(obj.getName());
// update the name, this object is mutable
obj.setName("newTest");
System.out.println(obj.getName());
}
} // خروجی : test newTestمجموعههای غیرقابل تغییر (Immutable Collections)
مجموعههای غیرقابل تغییر پس از ایجاد، نمیتوانند تغییر کنند. هرگونه تغییر در این مجموعهها منجر به ایجاد یک مجموعه جدید میشود. این ویژگی به بهبود امنیت و پایداری برنامه کمک میکند، زیرا از تغییرات ناخواسته در دادهها جلوگیری میکند.
برای ایجاد یک object تغییر ناپدیر (immutable)، کلاس را به صورت final تعریف کرده، و هیچ متدی برای ویرایش فیلدها ایجاد نکنید.
مثالهایی از مجموعههای غیرقابل تغییر:
String
- غیرقابل تغییر (Immutable): هنگامی که یک شیء از نوع String ایجاد میشود، مقدار آن نمیتواند تغییر کند. هر عملیاتی که به نظر میرسد یک رشته را تغییر میدهد، در واقع یک رشته جدید ایجاد میکند و مرجع آن را به متغیر اصلی اختصاص میدهد.
StringBuilder
- قابل تغییر (Mutable): برخلاف String، اشیاء از نوع StringBuilder را میتوان پس از ایجاد تغییر داد. این ویژگی باعث میشود که StringBuilder برای عملیات الحاق و دستکاری رشتهها بسیار کارآمد باشد.
StringBuffer
- قابل تغییر (Mutable): مانند StringBuilder، اشیاء از نوع StringBuffer نیز قابل تغییر هستند.
- Collections.unmodifiableList: این متد یک نمای غیرقابل تغییر از یک List ایجاد میکند.
- Collections.unmodifiableSet: این متد یک نمای غیرقابل تغییر از یک Set ایجاد میکند.
- Collections.unmodifiableMap: این متد یک نمای غیرقابل تغییر از یک Map ایجاد میکند.
مثال :
// make this class final, no one can extend this class
public final classImmutableExample {
private String name;
ImmutableExample (String name) {
this.name = name;
}
public String getName(){
return name;
}
//no setter
public static void main(String[] args) {
ImmutableExample obj = new ImmutableExample("test");
System.out.println(obj.getName());
// there is no way to update the name after the object is created.
// obj.setName("newTest");
//System.out.println(obj.getName());
}
} // خروجی testچرا از مجموعههای غیرقابل تغییر استفاده میکنیم؟
- امنیت: جلوگیری از تغییرات ناخواسته در دادهها
- پایداری: اطمینان از اینکه دادهها در طول برنامه ثابت میمانند
- به اشتراکگذاری: میتوان به صورت ایمن مجموعههای غیرقابل تغییر را بین چندین بخش از برنامه به اشتراک گذاشت
چه زمانی از کدام نوع استفاده کنیم؟
- مجموعههای قابل تغییر: زمانی که نیاز به تغییر دینامیکی محتویات یک مجموعه دارید.
- مجموعههای غیرقابل تغییر: زمانی که میخواهید دادهها را ایمن نگه دارید و از تغییرات ناخواسته جلوگیری کنید.
نکته مهم:
- بسیاری از کلاسهای مجموعه در جاوا متدهایی را ارائه میدهند که یک نمای غیرقابل تغییر از یک مجموعه قابل تغییر ایجاد میکنند. این کار به شما اجازه میدهد تا از مزایای هر دو نوع مجموعه استفاده کنید.
- در جاوا 8 و نسخههای بالاتر، کلاسهای Stream نیز برای کار با مجموعهها به صورت غیرقابل تغییر استفاده میشوند.
جمعبندی:
انتخاب بین مجموعههای قابل تغییر و غیرقابل تغییر به نیازهای خاص برنامه شما بستگی دارد. در حالت کلی، اگر به انعطافپذیری نیاز دارید، از مجموعههای قابل تغییر استفاده کنید و اگر به امنیت و پایداری نیاز دارید، از مجموعههای غیرقابل تغییر استفاده کنید.
منتظر نگاه های زیباتون هستم .
موفق و پیروز باشید.
مطلبی دیگر از این انتشارات
LogBack , Log4J , Log4j2 , Slf4j
مطلبی دیگر از این انتشارات
Exception Handling - Sample Code (Spring Boot)
مطلبی دیگر از این انتشارات
Heap and Stack in Java