Değişmez arayüz - Immutable interface

İçinde nesne yönelimli programlama, "değişmez arayüz"bir Desen tasarlamak için değişmez nesne.[1] Değişmez arayüz modeli, herhangi bir veri sağlamayan bir tip tanımlamayı içerir. yöntemler hangi mutasyon durumu. Bu tür tarafından referans verilen nesneler herhangi bir değiştirilebilir duruma sahip olarak görülmez ve değişmez görünür.

Misal

Java

İki boyutlu bir noktayı temsil eden bir Java sınıfı düşünün.

halka açık sınıf Point2D {    özel int x;    özel int y;    halka açık Point2D(int x, int y) { bu.x = x; bu.y = y; }    halka açık int getX() { dönüş bu.x; }    halka açık int getY() { dönüş bu.y; }    halka açık geçersiz setX(int yeniX) { bu.x = yeniX; }    halka açık geçersiz setY(int yeni y) { bu.y = yeni y; }}

Point2D sınıfı değiştirilebilir: durumu, oluşturulduktan sonra ayarlayıcı yöntemlerinden herhangi biri çağrılarak değiştirilebilir (setX () veya setY ()).

Point2D için değişmez bir arayüz şu şekilde tanımlanabilir:

halka açık arayüz ImmutablePoint2D {    halka açık int getX();    halka açık int getY();}

Point2D'nin ImmutablePoint2D uygulamasını yaparak, istemci kodu artık mutasyon yöntemlerine sahip olmayan ve dolayısıyla değişmez görünen bir türe başvurabilir. Bu, aşağıdaki örnekte gösterilmiştir:

ImmutablePoint2D nokta = yeni Point2D(0,0);  // Point2D'nin somut bir örneğine değişmez arayüz tarafından başvurulurint x = nokta.getX(); // geçerli yöntem çağrısıint y = nokta.setX(42); // derleme hatası: setX () yöntemi ImmutablePoint2D türünde mevcut değil

Yalnızca değişmez arayüzü referans alarak, somut nesnenin durumunu değiştiren bir yöntemi çağırmak geçerli değildir.

Avantajlar

  • Tipin değişmez amacını açıkça ifade eder.
  • Uygulayan türlerin aksine Değişmez Sarıcı kalıbı, bir "yayınlayarak değiştirme yöntemlerini" iptal etmesine "gerek yoktur.İşlem yok "talimat veya bir değiştirme yöntemi çağrıldığında bir çalışma zamanı istisnası atma.

Dezavantajları

  • Değişmez arabirim türü tarafından referans verilen örneklerin oyuncular somut, değişken tiplerine ve durumlarının mutasyona uğramasına neden olur. Örneğin:
    halka açık geçersiz mutasyona uğratmak(ImmutablePoint2D nokta) {    ((Point2D)nokta).setX(42); // bu çağrı yasaldır, çünkü tür                               // değiştirilebilir Point2D sınıfına dönüştürüldü}
  • Somut sınıflar, değişmez arabirimi uyguladıklarını açıkça beyan etmelidir. Bu, somut sınıf üçüncü taraf koda "aitse", örneğin bir kitaplıkta yer alıyorsa mümkün olmayabilir.
  • Nesne gerçekten değişmez değildir ve bu nedenle karma haritalar gibi değişmezliğe dayanan veri yapılarında kullanım için uygun değildir. Ve nesne "değiştirilebilir taraftan" aynı anda değiştirilebilir.
  • Değişmez nesneler için kullanılabilen bazı derleyici optimizasyonları, değiştirilebilir nesneler için kullanılamayabilir.

Alternatifler

Değişmez arayüz modeline bir alternatif, değişmez sarıcı Desen.

Kalıcı veri yapıları kendilerinin değiştirilmiş görünümlerine izin verirken etkili bir şekilde değişmezdir.

Referanslar