Informatika4-2018/Gyakorlat5

A MathWikiből
(Változatok közti eltérés)
(immutable)
a
94. sor: 94. sor:
 
* Ha egy változó immutable és final, akkor sem nem lehet egy kész példányt megváltoztatni, sem nem tud más példányra referálni.
 
* Ha egy változó immutable és final, akkor sem nem lehet egy kész példányt megváltoztatni, sem nem tud más példányra referálni.
 
* Primitív típusok esetén könnyű, mert a final egyben immutable is.
 
* Primitív típusok esetén könnyű, mert a final egyben immutable is.
 +
 +
== Feladatok ==
 +
Írjuk meg a '''User''' és '''Comment''' osztályokat immutable-nek.
  
 
[[Informatika4-2018/Gyakorlat4|Előző]] - [[Informatika4-2018#Gyakorlat|Fel]] - [[Informatika4-2018/Gyakorlat6|Következő]]
 
[[Informatika4-2018/Gyakorlat4|Előző]] - [[Informatika4-2018#Gyakorlat|Fel]] - [[Informatika4-2018/Gyakorlat6|Következő]]

A lap 2018. október 5., 10:22-kori változata

Előző - Fel - Következő

Tartalomjegyzék

Final, Immutable

final

tagváltozó

Ha tag-változó (adattag) előtt van a final kulcsszó, akkor azt jelenti, hogy a konstruktorban értéket kell neki adni és máshol pedig nem lehet!

public class Osztaly
{
    private final String name_;
    public Osztaly()
    {
        name_ = "";
    }
    public Osztaly(String name)
    {
        name_ =  name;
    }
    public void SetName(String name)
    {
        name_ =  name; // hibás!
    }
}

Konstruktoron kívül már egyenlőség jel bal oldalán nem szerepelhet, sem osztályon belül (private) sem kívül (public).

lokális változó

Ha egy függvényen belül lokális változó final, akkor csak egyszer inicializálható, egyszer állhat egyenlőség jel bal oldalán. De nem kell hogy ez egyből a deklaráció után legyen.

static public int ComputeX(int n)
{
    final int m;
    if (n==1)
        m = n;
    else if (n % 2 == 0)
        m = n/2;
    else
        m = 3*n + 1;
 
    // m új értéket már nem kaphat!
 
    return m;
}

függvény paraméter

Ha egy függvény paraméter final, akkor (hasonlóan) a függvény hívás után (a függvény belsejében) nem állhat egyenlőségjel bal oldalán.

final != const

Attól még, hogy valamit nem tudok egyenlővé tenni mással, változtatni még lehet. Ha egy osztálynak van setter-e, akkor azt hívhatom akkor is, ha az a példány final.

public class Osztaly
{
    private String name_;
    public Osztaly()
    {
        name_ = "";
    }
    public Osztaly(String name)
    {
        name_ =  name;
    }
    public void SetName(String name)
    {
        name_ =  name;
    }
    public static void main(String[] args)
    {
        final Osztaly peldany = new Osztaly("xyz");
        peldany.SetName("XYZ");  // OK
        peldany = new Osztaly(); // nem OK
    }
}

immutable

Ha egy osztály megváltoztathatatlan (immutable), az azt jelenti, hogy konstruálás után már nem lehet a benne lévő értékeket és állapotát megváltoztatni. Viszont lehet egy új példányt kreálni, ha ugyanazt a változót más értékkel akarjuk felruházni. A String például immutable, a primitív típusok wrapper-ei is immutable-ök (Integer, Boolean, Float).

public static void main(String[] args)
{
    String name = "abc";
    name[1] = "X"; // nem lehet!
 
    name = "aXc"; // lehet, egy új példány készül.
}
  • Erre sajnos nincsen kulcsszó, ha valaki úgy ír meg egy osztályt, hogy a fentiek teljesülnek rá, akkor sikerült egy immutable osztályt írnia, ha nem, akkor nem. Technikák immutable osztály írására:
    • Ha nincsen publikus setter
    • minden adattagja final és immutable
  • Ha egy változó immutable és final, akkor sem nem lehet egy kész példányt megváltoztatni, sem nem tud más példányra referálni.
  • Primitív típusok esetén könnyű, mert a final egyben immutable is.

Feladatok

Írjuk meg a User és Comment osztályokat immutable-nek.

Előző - Fel - Következő

Személyes eszközök