Interfață imuabilă

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 22 martie 2021; verificările necesită 4 modificări .

În programarea orientată pe obiecte , o „ Interfață imuabilă ” este un model pentru proiectarea unui obiect imuabil . [1] [2] [3] O interfață imuabilă include o definiție de tip care nu expune nicio metodă care poate schimba starea. Obiectele la care face referire acest tip par a fi imuabile.

Exemplu

Java

Luați în considerare clasa java , care este un punct 2D.

public class Point2D { private int x ; private int y ; public Point2D ( int x , int y ) { this . x = x ; aceasta . y = y _ } public int getX () { return this . x ; } public int getY () { return this . y ; } public void setX ( int newX ) { this . x = nouX ; } public void setY ( int newY ) { this . y = nou Y ; } }

Clasa Point2D este mutabilă: starea sa poate fi schimbată după creare prin apelarea uneia dintre metodele de setare ( setX()sau setY()).

Interfața imuabilă pentru Point2D poate fi definită ca:

interfață publică ImmutablePoint2D { public int getX (); public int getY (); }

Făcând din Point2D o implementare a lui ImmutablePoint2D, codul clientului poate folosi acum un tip care nu are metode de mutare și astfel rămâne imuabil. Acest lucru este demonstrat în următorul exemplu:

Punct2D imuabil = nou Punct2D ( 0 , 0 ); // o anumită instanță Point2D este referită de interfața imuabilă int x = point . getX (); // apel valid metoda punctului . setX ( 42 ); // eroare de compilare: metoda setX() nu există pe tipul ImmutablePoint2D

Cu doar o interfață imuabilă, nu este posibil să apelați o metodă care schimbă starea unui anumit obiect.

Beneficii

  • Transmite în mod clar intenția imuabilității tipului.
  • Spre deosebire de tipurile care implementează modelul de wrapper imuabil, nu trebuie să suprascrieți metodele de mutare utilizând o declarație no exploit sau aruncând o excepție de rulare atunci când este invocată metoda mutației.

Dezavantaje

  • Este posibil ca cazurile la care se face referire de către o interfață imuabilă să transmită la un anumit tip mutabil și apoi să schimbe starea. De exemplu:
public void mutate ( ImmutablePoint2D point ) { (( Point2D ) point ). setX ( 42 ); // apel valid deoarece // argumentul punct a fost turnat la Point2D }
  • Clasele concrete trebuie să declare în mod explicit o interfață imuabilă în implementarea lor. Acest lucru poate să nu fie posibil dacă o anumită clasă este „deținută” de un cod terță parte, cum ar fi dacă este conținută într-o bibliotecă.
  • Obiectul nu este cu adevărat imuabil și, prin urmare, nu este potrivit pentru utilizarea în structurile de date care necesită imuabilitate, cum ar fi hărțile hash. Și obiectul poate fi schimbat în același timp pe „partea schimbătoare”.
  • Este posibil ca unele optimizări ale compilatorului disponibile pentru obiectele imuabile să nu fie disponibile pentru obiectele mutabile.

Alternative

O alternativă la interfața imuabilă este modelul de înveliș imuabil .

Link -uri

  1. Interfață imuabilă . Preluat la 10 mai 2016. Arhivat din original la 27 septembrie 2010.
  2. imuabil: Glosar Java . Preluat la 10 mai 2016. Arhivat din original la 10 aprilie 2016.
  3. Practic Java Praxis 65: Utilizați moștenirea sau delegarea pentru a defini clasele imuabile | Practic Java Praxis 65: Utilizați moștenirea sau delegarea pentru a defini clasele imuabile | Inf… . Preluat la 10 mai 2016. Arhivat din original la 3 iunie 2016.