2009-04-03 16 views

Respuesta

16

La asignación diferida simplemente significa no asignar un recurso hasta que realmente se necesite. Esto es común con objetos singleton, pero estrictamente hablando, cada vez que se asigna un recurso lo más tarde posible, tiene un ejemplo de asignación diferida.

Al retrasar la asignación de un recurso hasta que realmente lo necesite, puede disminuir el tiempo de inicio, e incluso eliminar la asignación por completo si en realidad nunca utiliza el objeto. Por el contrario, puede preasignar un recurso que espera necesitar más adelante, lo que puede hacer que la ejecución posterior sea más eficiente a expensas del tiempo de inicio, y también evita la posibilidad de que la asignación falle más adelante en la ejecución del programa.

El siguiente código muestra un ejemplo de un producto único asignado perezosamente-:

public class Widget { 
    private Widget singleton; 

    public static Widget get() { 
     if (singleton == null) { 
      singleton = new Widget(); 
     } 
     return singleton; 
    } 

    private Widget() { 
     // ... 
    } 

    // ... 
} 

Ten en cuenta que este código no es multi-hilo. En la mayoría de los casos, el acceso al método get() se debe sincronizar de alguna manera.

Un concepto similar (y tal vez más general) es lazy initialization.

+0

son los términos "objetos tardíos" y "init perezoso" también? Como en el título de este texto * Java How to Program: Late Objects Version *? Busqué en Google pero no pude encontrar ninguna referencia más allá de ese texto. – hydeph

+1

@hydeph, parece que Deitel tiene dos versiones de ese libro, una con "objetos tardíos", donde los capítulos iniciales están en estilo de procedimiento (e introducen clases/objetos más adelante) y uno con "objetos primitivos", donde las clases/objetos se introducen de inmediato. Están usando "objetos tardíos" y "objetos tempranos" para distinguir entre estos estilos de enseñanza. No tiene ninguna relación con la inicialización perezosa. –

Cuestiones relacionadas