İmmutable object nədir?

Verdiyev Mahammad
3 min readDec 20, 2020

--

İmmutable(dəyişməyən) object, obyektin hər hansısa bir dəyərinin dəyişdirilməsi mümkünsüz olan obyektdir.

Javada immutable sinif yaratmaq üçün aşağıdakı qaydalara riayət edilməlidir:

  • Sinif daxilində bütün dəyişənlər private final olaraq elan edilməlidir.
  • Sinif daxilində setter metodlar yaradılmamalıdır.(obyekt dəyərlərini dəyişdirən metodlar)
  • Sinfin override edilməsinin qarşısı alınmalıdır.
  • Əgər sinif özündə mutable obyektin referansını saxlıyırsa, bu obyektin dəyişdirilməsinin qarşısı alınmalıdır.

Dəyişənlərin private elan edilməsi, Sinif xaricindən hər hansısa bir müdaxilənin qarşısını alır . Final olması isə bunun başlanğıc qiymətindən sonra qiymətinin dəyişməyəcəyinin qarantisidir.

class Human {
private final String firstName;
private final String lastName;
public Human(String f_name, String l_name)
{
firstName = f_name;
lastName= l_name;
}

}

Əlbəttə bu bir sinfin immutable olması üçün bəs etmir.

Sonrakı maddəmiz, setter metodların olmaması ilə bağlıdır.

class Human {
private String firstName;
private String lastName;
public Human(String f_name, String l_name)
{
firstName = f_name;
lastName = l_name;
}
public void setFirstName(String newFirstName) // setter metod
{
firstName = newFirstName;
}}

Gördüyünüz kimi bu tipli metodların olması sinfin immutable olmasının qarşısını alır.

3- cü maddəmiz sinfin override edilməsinin qarşısını almaqdır. Əgər biz bu maddəni pozsaq nə baş verər gəlin ona baxaq.

class Human {
private final String firstName;
public Human(String name) {
firstName = name;
}
public String getName() {
return firstName;
}
}class Male extends Human {private String maleName;public Male(String name) {
super(name);
maleName = name;
}
public String getName()
{
return maleName;
}
public void setName(String name)
{
maleName = name;
}

}

Human sinfi final olmadığı üçün Male sinfi Human sinfini extend edə bilir. Human sinfində olan getName() metodu üst sinifdə olan firstName dəyişəninə aid metoddur. Extend etdiyimizə görə bu metodu override edib fərqli dəyərlər qaytara bilərik. Beləliklə obyekt immutable olmaz.

public class Main {
public static void main(String[] arguments) {
Male male = new Male("Polad"); Human human = (Human) male; System.out.println("Oğlanın adı " + human.getName()); male.setName("Farid"); System.out.println("Oğlanın adı " + human.getName()); }
}

Çıxış verilənləri:

Oğlanın adı Polad
Oğlanın adı Farid

Əgər sinif daxilində mutable obyekt varsa, sinif xaricinə ötürülməməlidir. Əgər bu obyekti sinifdən kənarda istifadə etmək çox vacibdirsə, bu obyektin kopyasını istifadə edin.

final class PersonalComputer {
private final GraphicsCard card;
...
...
...
PersonalComputer(GraphicsCard card, ...) {
this.card = card;
}
public GraphicsCard getGraphicsCard() throws CloneNotSupportedException {
return (GraphicsCard) card.clone();
}
}class GraphicsCard implements Cloneable {
String brandName;
int memory;
int boostClock;
public GraphicsCard(String brandName, int memory, int boostClock) {
this.brandName = brandName;
this.memory = memory;
this.boostClock = boostClock;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

PersonalComputer sinfi immutable sinifdir. Eyni zamanda özündə mutable obyektin(card) referansının saxlıyır. Əgər bizə bu referans lazımdırsa biz bu obyektin kopyasını return etməliyik, və əlbəttəki bu obyekt Cloneable(klonlanabilən) olmalıdır.

...
public GraphicsCard getGraphicsCard() throws CloneNotSupportedException {
return (GraphicsCard) card.clone(); // obyektin kopyası
}

Obyektin immutable olması bizə bəzi üstünlüklər qazandırır:

  • İmmutable obyekt yaradıldığı zamandan etibarən dəyərlərini konstruktor üzərinnən alırlar və bu dəyərlər heç vaxt dəyişmir.Beləliklə sinxronizasiya problemləri olmur, yəni thread-safe olurlar.
  • Immutable siniflərin dizayn edilib istifadə edilməsi mutable siniflərə nəzərən daha asandır.
  • Immutable obyektlər arasında heç bir ziddiyyət olmadığı üçün proqramı paralelləşdirməyi asanlaşdırır.
  • Exceptionlarınız(istisnalar) olsa belə proqramınız strukturlu olacaq.

Mənfiləri:

İmmutable siniflərin əsas mənfisi odurki, hər bir fərqli dəyər üçün ayrı bir obyekt yaratmaq lazımdır. Bu da garbage collectorun daha çox işləməsi deməkdi hansı ki proqramın sürətini azaldan faktorlardan biridir.

İstifadə olunan mənbələr:

https://hackernoon.com/5-benefits-of-immutable-objects-worth-considering-for-your-next-project-f98e7e85b6ac

https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html#:~:text=An%20object%20is%20considered%20immutable,particularly%20useful%20in%20concurrent%20applications.

https://en.wikipedia.org/wiki/Immutable_object

https://reflectoring.io/java-immutables/

--

--

Verdiyev Mahammad
Verdiyev Mahammad

Written by Verdiyev Mahammad

In God we trust; all others bring data - W. Edwards Deming

No responses yet