Come congeliamo un oggetto mentre costruisci un oggetto usando il modello JavaBeans?

4

Passando attraverso Java efficace, Joshua Bloch afferma che l'inconveniente dell'uso del modello JavaBeans è che un oggetto può trovarsi in uno stato incoerente partendo dalla costruzione e con il modello JavaBeans, non possiamo rendere la nostra classe immutabile. Ho capito molto.

Dice anche che possiamo ridurre questi inconvenienti "congelando" l'oggetto quando la sua costruzione è completa e non permettendogli di essere usato fino a quando non è congelato.

Qualcuno può aiutarmi a capire cosa significa "congelare" l'oggetto?

    
posta Karan Khanna 18.04.2018 - 13:10
fonte

2 risposte

5

In effetti, "congelare" significa solo lanciare molte eccezioni:

  1. Mentre l'oggetto viene costruito, qualsiasi tentativo di leggerlo (tramite getter o metodi), genera una sorta di eccezione "ancora in costruzione" che viene lanciata.
  2. Una volta costruiti e "congelati", eventuali chiamate a setter o metodi che potrebbero cambiare stato provocano le eccezioni "siamo ora bloccati".

Questo è uno schema disordinato e non credo che sia ampiamente usato. Un modello molto più ordinato è il modello di builder. L'idea è che tu abbia un oggetto (il costruttore) che è mutabile e può essere costruito in più fasi. Una volta completato, emette quindi un oggetto immutabile che viene quindi utilizzato nelle operazioni successive.

Se il pattern sembra familiare, perché è esattamente come funziona la classe StringBuilder (quindi il nome).

    
risposta data 18.04.2018 - 13:18
fonte
-1

Il congelamento di una classe sarebbe qualcosa come:

public class Foo
{

    private int a;
    private int b;
    private boolean frozen;

    public int getA()
    {
        return this.a;
    }

    public int getB()
    {
        return this.b;
    }

    public synchronized void setA(final int a)
    {
        checkNotFrozen();
        this.a = a;
    }

    public synchronized void setB(final int b)
    {
        checkNotFrozen();
        this.b = b;
    }

    public boolean isFrozen()
    {
        return this.frozen;
    }

    public synchronized void freeze()
    {
        this.frozen = true;
    }

    private void checkNotFrozen()
    {
        if (this.frozen)
            throw new RuntimeException();
    }

}
    
risposta data 18.04.2018 - 14:14
fonte

Leggi altre domande sui tag