Quick Java Domanda: istanziare una determinata classe solo da un'altra?
-
03-07-2019 - |
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.
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