272. Writing your own immutable objects

אז הכרנו בפעם שעברה קצת מה זה Immutable Object.

יכול להיות שהשתכנעתם, ואתם רוצים לרוץ לממש בעצמכם Immutable Object.

בוודאי תתאכזבו לגלות כי אין איזשהו ממשק שאפשר לרשת ממנו המציין שאובייקט הוא Immutable.

במקום זאת קיים הKeyword ששמו readonly המציין כי Field מסוים ניתן לאתחול רק בConstructor שלו. אם ננסה לאתחל אותו מחוץ לConstructor, נקבל שגיאת קימפול.

למשל:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class MyImmutableClass
{
private readonly string mName;
private readonly int mAge;
public MyImmutableClass(string name, int age)
{
mAge = age;
mName = name;
}
public int Age
{
get
{
return mAge;
}
}
public string Name
{
get
{
return mName;
}
}
}

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

1
2
3
4
5
public void IncreaseAge()
{
mAge++;
// Doesn't compile! : A readonly field cannot be assigned to (except in a constructor or a variable initializer)
}

(ראו גם טיפ מספר 14)

לכן הדרך המומלצת לממש Immutable object היא ע"י יצירת מחלקה שכל השדות שלה הן readonly.

שימו לב שזה לא מספיק, כי במידה ואחד הFields הוא לא Immutable בעצמו, נוכל לשנות את הField, ולכן גם את האובייקט עצמו. לכן חשוב לדאוג שגם כל הFieldים של המחלקה שלנו יהיו בעצמם Immutable…

המשך יום בלי יותר מדי שינויים טוב

שתף