utilizzando questo in un costruttore, perché funziona?

0

Ho due classi.

  • busiObj (creato da vecchi file flat)
  • (fornisce mezzi per distinguere busiObj)

la chiave ha un lettore che prende un busiObj

public key(busiObj foo)
{
    bar = foo.someThing;
    [...]
}

Voglio creare la chiave nel campo del busiObj

public busiObj(...)
{
    myKey = new key(this);
    [...]
}

Tuttavia: perché mai funziona?
Mi aspettavo fermamente che il compilatore lanciasse qualcosa come:
"Non puoi fare riferimento a un oggetto che viene attualmente creato, duh".

Quindi: come posso fare riferimento a un oggetto mentre è ancora in costruzione?

    
posta Mark 01.07.2014 - 09:20
fonte

2 risposte

2

So: How is it that I can reference an object while it is still being constructed?

Presumibilmente Perché è utile (anche se in modo pericoloso) esattamente per lo scenario che descrivi, quindi i progettisti linguistici hanno deciso di consentirlo.

Tecnicamente, non è affatto un problema: mentre l'oggetto viene costruito, la sua memoria deve essere già allocata, quindi puoi certamente avere un riferimento ad esso.

    
risposta data 01.07.2014 - 09:32
fonte
1

Perché ciò accade perché questo è un riferimento all'area di memoria attualmente occupata dal tuo oggetto. Poiché le istruzioni nel codice vengono eseguite in modo sequenziale, hai già il tuo oggetto in stato a cui fai riferimento quando arrivi al punto di chiamare il metodo key () .

Sebbene sia possibile, l'intero approccio è sbagliato. I metodi all'interno di un oggetto dovrebbero solo cambiare lo stato dell'istanza, non lo stato di altre istanze di quell'oggetto. Il tuo esempio funziona perché si traduce approssimativamente nel seguente codice in fase di runtime:

public busiObj() { 
    myKey = new key();
    [...]
}

public key()
{
    bar = foo.someThing;
    [... use "this" here to reference your object internally ...]
    [... other stuff here ...]
}
    
risposta data 01.07.2014 - 10:33
fonte

Leggi altre domande sui tag