Pregunta

Mi problema es así: necesito una manera de asegurarme de que solo una clase dada pueda crear una instancia de otra. No quiero tener que hacer del otro una clase interna anidada o algo tonto como ese. ¿Cómo hago esto? Me olvido de improviso.

¿Fue útil?

Solución

Hacer que el constructor sea privado. Cree un método de fábrica estático que tome una instancia de la clase a la que se le permite el acceso. Haga que el método de fábrica cree un objeto adecuado y use un configurador en el objeto que tenga acceso al objeto creado para dar a esa clase la copia creada.

public class AllowedAccess
{
    private SecureClass secure;
    public setSecureClass( SecureClass secure )
    {
        this.secure = secure;
    }

    ...
}

public class SecureClass
{
     private SecureClass() {}

     public static void Create( AllowedAccess allowed )
     {
          allowed.setSecureClass( new SecureClass() );
     }

     ...
}

Por cierto, sospecho de este diseño. Parece muy unido a mí.

Otros consejos

Una clase interna estática privada es exactamente lo que quieres. Nada tonto al respecto.

public class Creator {
  private static class Created {
  }
}

De lo contrario, solo puede proteger la creación de instancias en el nivel del paquete.

public class Created {
  Created() {
  }
}

Que solo da acceso a las clases del mismo paquete al constructor.

Puede hacer que la clase que se protegerá del paquete de instanciación sea privada.

Estoy de acuerdo con la respuesta de tvanfosson y también con su comentario sobre un acoplamiento demasiado alto. ¿Por qué no retiene más control sobre su proceso de creación de clases adoptando un marco Inversión de control como Spring o Guice ?

En mi humilde opinión crear clases con el " nuevo " la declaración se considerará un poco ... obsoleta, se preferirán las fábricas y los marcos de trabajo de IoC aún más.

Saludos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top