در این مقاله سعی داریم تفاوت اشیای mutable (تغییر پذیر) و immutable (تغییرناپذیر) ، را در برنامه نویسی شی گرا بررسی نماییم .

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|