mutable به اشیایی گفته میشود که پس از ایجاد میتوان مقدار آن و حالات آن را تغییر داد مانند کلاس های StringBuilder, java.util.Date در جاوا .
immutable به اشیایی گفته میشود که دقیقا برعکس mutable عمل کرده و پس از ایجاد ، نمیتوان مقدار آنها را تغییر داد . این اشیاء setter ندارند ، مانند کلاس های Double, String در جاوا . کلاس Hibernate Session Factory در فریم ورک Hibernate هم یک آبجکت immutable محسوب میشود .
همچنین این اشیاء در برنامه نویسی هم روند جزو اشیای thread-safe محسوب میشوند .
از مزایای اشیای immutable میتوان به موارد زیر اشاره کرد :
- برای ساخت، تست و استفاده ، ساده هستند .- عموما خطاها و اکسپسن های دیتا تایپ هنگام ایجاد آبجکت جدید و ست کردن دیتا در کانستراکتور آبجکت ، سریعا مشخص میشوند .
- در برنامه نویسی هم روند جزو اشیای امن حساب میشوند .
هنگام ساخت اشیای immutable باید به موارد زیر دقت شود :
- کلاس ها را باید از نوع final تعریف کنیم .- تمامی فیلد ها باید از نوع private باشند تا جلوی دسترسی مستقیم به آنها گرفته شود .
- متد setter برای فیلد ها پیاده سازی نشود .
- فیلدهای mutable از نوع final تعریف شوند .
- مقادیر فیلدها از طریق متد سازنده یا constructor ، به فیلد ها set شود .
در این کد قسمت میخواهیم دو کلاس را به صورت mutable و immutable را در جاوا پیاده سازی کنیم .
کلاس mutable
public class MutableUser {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public MutableUser(String name) {
this.name = name;
}
public static void main(String[] args) {
MutableUser mutableUser = new MutableUser("Reza");
System.out.println(mutableUser.getName());
mutableUser.setName("JohnDoe");
System.out.println(mutableUser.getName());
}
}
//خروجی
Reza
JohnDoe
کلاس immutable - این کلاس را از نوع final تعریف میکنیم.
public final class ImmutableUser {
private String name;
public ImmutableUser(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static void main(String[] args) {
ImmutableUser immutableUser = new ImmutableUser("|REZA|");
System.out.println(immutableUser.getName());
}
}
//خروجی
|REZA|