Sobes.tech
Middle

Azt jelenti ez, hogy az osztály immutábilis, ha van nyilvános tulajdonsága az osztálynak?

sobes.tech MI

Válasz az MI-től

Nem.

Egy osztályban nyilvános tulajdonság azt jelenti, hogy ennek a tulajdonságnak az értéke kívülről módosítható az objektumon. Egy változatlan (immutable) objektum olyan, amelynek állapota (tulajdonságainak értékei) nem módosítható a létrehozás után. Egy nyilvános tulajdonság megléte ellentmond az immutable elvnek.

Az immutable eléréséhez az osztálynak a következő feltételeknek kell megfelelnie:

  • Minden tulajdonságnak privát (private) vagy védett (protected) kell lennie.
  • Nincs szetter (setter) metódus, amely módosítaná a tulajdonságokat.
  • Minden függőség (az osztály által használt objektumok) szintén immutable kell legyen, vagy állapotuk nem változhat kívülről.
  • A konstruktor teljes mértékben inicializálja az objektumot, és nem módosítható utána.
  • Ha változtatások szükségesek, új példányokat kell létrehozni az új értékekkel.

Példa egy nyilvános tulajdonsággal rendelkező (mutable) osztályra:

<?php
class MutableObject
{
    public $value; // Nyilvános tulajdonság

    public function __construct($value)
    {
        $this->value = $value;
    }
}

$obj = new MutableObject(10);
echo $obj->value; // 10

$obj->value = 20; // Az érték kívülről módosult

echo $obj->value; // 20

Példa egy immutable osztály megvalósítására:

<?php
class ImmutableObject
{
    private $value; // Privát tulajdonság

    public function __construct($value)
    {
        $this->value = $value;
    }

    public function getValue() : int
    {
        return $this->value;
    }

    // Metódus a "módosításhoz", valójában új objektumot hoz létre
    public function withValue(int $newValue) : self
    {
        return new self($newValue);
    }
}

$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10

// $obj1->value = 20; // Hiba: nem lehet hozzáférni a privát tulajdonsághoz

$obj2 = $obj1->withValue(20); // Új objektum jön létre

echo $obj1->getValue(); // 10 (az eredeti objektum nem változott)
echo $obj2->getValue(); // 20 (új objektum a módosított értékkel)