Posso utilizzare un costruttore di pacchetto visibile per la creazione?

0

Ho bisogno di una classe in cui ciò può essere fatto:

// user program
elder_tales.Player p = elder_tales.generate_player();
elder_tales.level_up_player( p );

ma non:

// user program
elder_tales.Player p = new ...whatever
p.set_stats();
p.set_server();
p.calculate_experience()
elder_tales.level_up_player( p )

Fondamentalmente, voglio che il pacchetto esegua l'istanziazione mentre non consente all'utente di eseguire la propria istanziazione; Poiché le istanze di tipo Player sono costruite in modo complesso, ho deciso di non mettere troppo a dura prova l'utente per crearle con un costruttore pubblico.

    
posta user2738698 16.04.2014 - 18:45
fonte

2 risposte

3

Si chiama Metodo di fabbrica . Devi solo renderlo static , in modo che tu possa chiamarlo su una classe, piuttosto che su un oggetto istanziato.

public static Player generate_player()
{
    elder_tales.Player p = new ...whatever
    p.set_stats();
    p.set_server();
    p.calculate_experience();
    return p;
}

Questo metodo va nella tua classe Player o in qualsiasi altra classe di utilità che stai utilizzando per generare giocatori. Non c'è un modo per mettere a nudo metodi di fabbrica o metodi di costruzione al di fuori di una classe, per quanto ne so.

Per disabilitare il costruttore di Player in modo che solo il metodo factory possa usarlo, omettere il modificatore di accesso del costruttore. Per impostazione predefinita l'accesso è Privato.

    
risposta data 16.04.2014 - 19:18
fonte
-1

Innanzitutto, definisci il costruttore come "pacchetto privato" omettendo il modificatore di accesso. Questo lo rende così che il costruttore possa essere chiamato dallo stesso pacchetto, ma non dal pacchetto che sta usando il pacchetto.

Quindi si crea un metodo statico che crea e restituisce l'istanza concreta. Questo avrà lo stesso codice che hai scritto.

    
risposta data 16.04.2014 - 19:32
fonte

Leggi altre domande sui tag