2012-06-13 4 views
7

Per qualche motivo non riesco a far funzionare tutto questo (codice pesantemente semplificato che non riesce):AS3 TypeError: Error # 1007: la creazione di istanze tentata su un non-costruttore

package com.domain { 
    public class SomeClass { 
     private static var helper:Helper = new Helper(); 
    } 
} 

class Helper { 
} 

Compila, ma getta su di prima accesso di SomeClass:

TypeError: Error #1007: Instantiation attempted on a non-constructor. 
    at com.domain::SomeClass$cinit() 
    ... 

risposta

1

+1 a Darren. Un'altra opzione è quella di spostare la classe Helper alla parte superiore del file

class Helper { 
} 

package com.domain { 
    public class SomeClass { 
     private static var helper:Helper = new Helper(); 
    } 
} 
+0

Non avevo idea di poterlo fare. Non ho avuto la possibilità di testare, ma se funziona è proprio questo. – Blanka

+0

Questo è davvero bello, anche a me non avevo idea di poterlo fare. Detto questo, per il mio caso d'uso specifico, continuo a non pensare che funzionerebbe (devo ancora testarlo tbh) ... il compilatore Flex dovrebbe davvero analizzare l'intero file, prima di compilare qualsiasi cosa –

+2

'Errore di sintassi: il pacchetto è inaspettato – Panzercrisis

0

è necessario generare un costruttore e dichiarare la variabile nella classe, non la funzione:

package com.domain { 
    public class SomeClass { 
     private static var helper:Helper 
     public function SomeClass() { 
      helper = new Helper(); 
     } 
    } 
} 

class Helper { 
} 
+1

Interessante ... Questo sembra funzionare, anche se questo approccio significa che si deve creare un'istanza di 'SomeClass' prima che il membro statico' Helper' è disponibile . Inoltre, è piuttosto strano inizializzare un membro statico in un costruttore di istanze. Ad esempio, se crei più istanze di 'SomeClass', il membro statico verrà reimpostato ogni volta ... Non quello che vuoi. Un altro esempio, se si ha un metodo statico usando 'helper', lo troverà come' null' _until_ istanziate 'SomeClass' almeno una volta. Strano, per non dire altro. – Blanka

+1

non è necessario creare un'istanza all'interno del constuctor. Quindi non lo sovrascrivi ogni volta che istanzia SomeClass. – WolvDev

+0

Ma quando istanziate il nuovo Helper() chiamate il costruttore della classe Helper e questo è dove si verifica l'errore. Helper non ha costruttore? – WolvDev

1

Penso che non possa funzionare con Helper e SomeClass entrambi nello stesso file. Quando SomeClass è inizializzato, la classe Helper non è ancora stata inizializzata e quindi non è possibile creare un oggetto Helper.

Spostare l'aiuto in un file separato dovrebbe risolvere il problema.

+0

Ha scritto che questo esempio è "codice fortemente semplificato che non riesce". Penso che ce l'abbia in due file separati. – WolvDev

+1

In realtà, sono pensati per essere nello stesso file. @silyevsk, penso che questo sia davvero un problema di ordine di inizializzazione. – Blanka

+0

** ha ** per essere nello stesso file, questo è come si crea un [costruttore privato in Actionscript] (http: // stackoverflow.it/a/17464207/238419) –

2

L'errore non-costruttore è il modo imbarazzante del compilatore di dire "hai chiamato un costruttore per una classe che non ho ancora visto"; se fosse un po 'più intelligente, potrebbe controllare il file (unità di compilazione) per le classi interne prima di lamentarsi ... mehhh

Visto che hai dato l'accesso statico variabile private, ovviamente hai intenzione di utilizzare l'istanza solo internamente a SomeClass (ipotesi, potrebbe essere distribuito come valore di ritorno).

La seguente soluzione differisce creazione del var statico cioè quando la classe interna viene inizializzato quando il (presumibilmente implicito) Helper.cinit() viene invocato, anziché SomeClass.cinit() quando Helpernon esiste ancora:

package com.domain { 
    public class SomeClass { 

     public function doSomething(param:*):void { 
      // ... use Helper.INSTANCE 
     } 

    } 
} 

class Helper { 
    public static const INSTANCE:Helper = new Helper(); 
} 
Problemi correlati