Estaba pensando en el tema clásico de la inicialización Singleton perezoso - todo el asunto de la ineficiencia de:¿Una implementación singleton obvia para .NET?
if (instance == null)
{
instance = new Foo();
}
return instance;
Cualquiera que sepa lo que es un Singleton es está familiarizado con el tema (sólo necesita el si de una vez). Es trivial pero irritante.
Por lo tanto, pensé en una solución alternativa, por lo menos para .NET (aunque debe trabajar en cualquier lugar que tiene algún equivalente a funcionar punteros:
public class Foo
{
private delegate Foo FooReturner();
private static Foo innerFoo;
private static FooReturner fooReturnHandler = new FooReturner(InitialFooReturner);
public static Foo Instance
{
get
{
return fooReturnHandler();
}
}
private static Foo InitialFooReturner()
{
innerFoo = new Foo();
fooReturnHandler = new FooReturner(NewFooReturner);
return innerFoo;
}
private static Foo NewFooReturner()
{
return innerFoo;
}
}
En pocas palabras - la Instancia devuelve un método delegado. El delegado se establece inicialmente en un método que inicializa su instancia, luego cambia el delegado para que apunte a un método de devolución simple.
Ahora, me gusta pensar que no soy terrible en mi trabajo, pero no tengo pretensiones acerca de ser increíble. No he visto un ejemplo de este código en ninguna parte.
Ergo, llegué a la conclusión de que me falta algo. Algo importante. O bien, que todo el problema es demasiado trivial para molestarnos pensando que mucho o esto hace algo horrible que destruirá el universo. O fallo en la búsqueda y, por lo tanto, no he visto los cientos de desarrolladores que usan este método. Algo, de todos modos.
Tenía la esperanza de que las buenas personas aquí en Stack Overflow pudieran darme una pista sobre qué (dejando de lado la controversia sobre si uno debería usar un Singleton en absoluto).
EDITAR una aclaración:
Esto no es un código de actuación (aunque si el diseño se degrada de forma activa el rendimiento más allá del modelo tradicional, que sería interesante saber).
Fue escrito puramente como prueba de concepto, y estoy consciente de que no es seguro para subprocesos como debería ser. ¿Hay alguna razón por la cual NO podría hacerse segura para hilos por su propia naturaleza?
"ineficiencia" - Me preocuparía más que en realidad no es seguro para subprocesos ;-p –
Vuelva a editar ... pero agrega complejidad y no soluciona ningún problema ... ¿por qué elegiría esto solo con un cheque nulo? Si desea corregir la seguridad del hilo, lea la página de Jon ... –
+1 "Hipótesis de destrucción del universo". : P Aparte de eso, buena pregunta y favorita para el registro. –