Domanda

Il mio problema è quindi: ho bisogno di un modo per assicurarmi che solo una data classe possa creare un'istanza per un'altra. Non voglio fare dell'altro una classe interiore nidificata o qualcosa di così stupido. Come faccio a fare questo? Dimentico di persona.

È stato utile?

Soluzione

Rendi privato il costruttore. Creare un metodo factory statico che accetta un'istanza della classe a cui è consentito l'accesso. Chiedi al metodo factory di creare un oggetto adatto e usa un setter sull'oggetto a cui è consentito l'accesso all'oggetto creato per dare a quella classe la copia creata.

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() );
     }

     ...
}

A proposito, sono sospettoso di questo design. Sembra troppo abbinato a me.

Altri suggerimenti

Una classe interna statica privata è esattamente quello che vuoi. Niente di stupido al riguardo.

public class Creator {
  private static class Created {
  }
}

Altrimenti puoi proteggere solo l'istanza a livello di pacchetto.

public class Created {
  Created() {
  }
}

Che consente l'accesso al costruttore solo alle classi dello stesso pacchetto.

È possibile rendere privata la classe da proteggere dal pacchetto di istanza.

Sono d'accordo con la risposta di tvanfosson e anche con il suo commento sull'accoppiamento troppo elevato. Perché non mantieni più controllo sul processo di creazione della tua classe adottando un Inversion of Control framework come Spring o Guice ?

IMHO crea classi con il " nuovo " dichiarazione deve essere considerata un po '... obsoleta, le fabbriche devono essere preferite e le strutture IoC ancora di più.

Saluti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top