Bloques estáticos en AS3

Los bloques estáticos son bloques de código pertenecientes a una clase que se ejecutan una única vez cuando la clase en cuestión es cargada por primera vez en la AVM.
Dentro de un bloque estático se puede ejecutar cualquier tipo de expresión y referenciar a otras clases pero se debe tener en cuenta que desde el bloque, al estar dentro del ámbito de la clase (no de la instancia, de ahí que se llamen bloques estáticos), solo se pueden referenciar las propiedades y métodos estáticos de la clase.
Un bloque estático es equiparable a un constructor pero dentro del ámbito de clase (no de instancia).

El siguiente código muestra el uso de un bloque estático a modo de inyección de dependencias dinámico:

Actionscript:
  1. /* Archivo.as */
  2. package com.joangarnet.persistencia {
  3.    
  4.     import flash.system.Capabilities;
  5.    
  6.     public class Archivo implements IArchivo{
  7.         static private var archivoImpl:IArchivo;
  8.        
  9.         /* bloque estático */
  10.         {
  11.             if( Capabilities.playerType == "Desktop" ){
  12.                 // guarda en el sistema de archivos del O.S.
  13.                 archivoImpl = new ArchivoAIR();
  14.             }else{
  15.                 // guarda en web
  16.                 archivoImpl = new ArchivoFlex();
  17.             }
  18.             trace( Capabilities.playerType );
  19.         }
  20.        
  21.         /* 
  22.          * implementacion de IArchivo
  23.          */
  24.         public function guardar():void{
  25.             archivoImpl.guardar();
  26.         }
  27.        
  28.         public function borrar():void{
  29.             archivoImpl.borrar();
  30.         }
  31.     }
  32. }
  33.  
  34. /* IArchivo.as */
  35. package com.joangarnet.persistencia{
  36.     public interface IArchivo{
  37.         function guardar():void;
  38.         function borrar():void;
  39.     }
  40. }
  41.  
  42. /* ArchivoAIR.as */
  43. package com.joangarnet.persistencia{
  44.     public class ArchivoAIR implements IArchivo{
  45.         public function guardar():void{
  46.             trace("guardar() en el sistema de archivos local")
  47.         }
  48.        
  49.         public function borrar():void{
  50.             trace("borrar() en el sistema de archivos local")
  51.         }
  52.     }
  53. }
  54.  
  55. /* ArchivoFlex.as */
  56. package com.joangarnet.persistencia{
  57.     public class ArchivoFlex implements IArchivo{
  58.         public function guardar():void{
  59.             trace("guardar() vía web")
  60.         }
  61.        
  62.         public function borrar():void{
  63.             trace("borrar() vía web")
  64.         }
  65.     }
  66. }

TestBloqueEstatico.mxml

XML:
  1. <?xml version = "1.0" encoding = "utf-8"?>
  2. <mx:Application xmlns:mx = "http://www.adobe.com/2006/mxml" layout = "absolute">
  3.     <mx:Script>
  4.         <![CDATA[
  5.             import com.joangarnet.persistencia.Archivo;
  6.  
  7.             private var f:Archivo = new Archivo();
  8.         ]]>
  9.     </mx:Script>
  10.     <mx:Button click = "f.borrar()" label="borrar" />
  11.     <mx:Button click = "f.guardar()" label="guardar" />
  12. </mx:Application>

Si se ejecuta en el contexto de una aplicación AIR y clicamos en los dos botones borrar y guardar respectivamente se mostrará en la consola:

borrar() en el sistema de archivos local
guardar() en el sistema de archivos local

Si de lo contrario se hace desde el navegador se mostrará:

borrar() vía web
guardar() vía web