È una cattiva pratica creare nuovi oggetti senza memorizzarli?

22

Ho visto oggetti creati nel codice Java senza memorizzare un riferimento all'oggetto. Ad esempio, in un plugin di eclissi ho visto una shell SWT creata in questo modo:

new Shell();

Questo nuovo oggetto Shell non è memorizzato in una variabile, ma rimarrà referenziato fino a quando la finestra non viene eliminata e [Credo che?] avvenga automaticamente quando la finestra è chiusa.

È una cattiva pratica creare oggetti come questo senza memorizzare un riferimento ad essi? O la biblioteca era mal progettata? Cosa succede se non ho bisogno di un riferimento, ma voglio solo gli "effetti collaterali" dell'oggetto? Devo comunque memorizzare un riferimento?

UPDATE:

Ammetto che il mio esempio precedente è scadente. Mentre ho visto elementi dell'interfaccia utente creati in questo modo, la creazione di una shell SWT come questa sarebbe probabilmente inutile perché è necessario chiamare il metodo aperto nell'istanza di Shell. Ci sono esempi migliori forniti da aix come il seguente da Tutorial sulla concorrenza di Java :

(new HelloThread()).start();

Questa pratica è vista in molti contesti, quindi le domande rimangono. È una buona pratica?

    
posta Buttons840 12.01.2012 - 21:15
fonte

5 risposte

12

C'è un elemento di preferenza personale su questo, ma penso che non memorizzare il riferimento non sia necessariamente una cattiva pratica.

Considera il seguente esempio ipotetico:

new SingleFileProcessor().process(file);

Se è necessario creare un nuovo oggetto processore per ogni file e non è necessario dopo la chiamata di process() , non è necessario archiviare un riferimento ad esso.

Ecco un altro esempio, tratto dal tutorial Java sulla concorrenza :

(new HelloThread()).start();

Ho visto molti altri esempi quando il riferimento non è memorizzato, e questo ha letto perfettamente bene ai miei occhi, come ad esempio:

String str = new StringBuilder().append(x).append(y).append(z).toString();

(L'oggetto StringBuilder non viene mantenuto.)

Ci sono modelli simili che coinvolgono common.lang's HashCodeBuilder et al.

    
risposta data 12.01.2012 - 21:20
fonte
7

Se non hai bisogno di un riferimento all'oggetto creato, non tenere il riferimento. È così semplice.

    
risposta data 13.01.2012 - 03:42
fonte
5

In generale, è buona norma rilasciare i riferimenti il più rapidamente possibile. Non vedo alcuna differenza tra:

HelloThread thread = new HelloThread();
thread.start();
// where thread is never used for the rest of the method

e

(new HelloThread()).start();

Per quanto riguarda il codice, stai semplicemente evitando l'uso di un nome di variabile, che potrebbe essere una cosa positiva. Il compilatore JIT è in genere abbastanza intelligente da riconoscere che è in grado di raccogliere i thread dopo l'ultimo utilizzo, quindi non c'è probabilmente alcuna differenza dal punto di vista delle prestazioni.

L'unico vero problema da evitare è il Codice in Constructor Anti -Pattern , ma non sembra che sia quello che stai chiedendo.

    
risposta data 12.01.2012 - 21:46
fonte
3

Questo potrebbe essere un problema se usi SWT, perché devi ripulirti da solo (chiamando il metodo dispose ()). Ma per le altre classi (non SWT) va bene.

Ecco un articolo su Gestione delle risorse del sistema operativo

    
risposta data 12.01.2012 - 21:21
fonte
1

Prima di tutto, infastidirai le persone che hanno imparato C o C ++ prima di Java. Lo lascerò come esercizio per il lettore per decidere se è un pro o un contro.

Mentre ci sono certamente situazioni in cui gli oggetti sono progettati per essere di breve durata, la maggior parte del tempo se qualcosa è abbastanza complesso da creare un oggetto, è abbastanza complesso da avere buoni motivi per tieni un riferimento, quindi non tenerlo dovrebbe essere per lo meno un avvertimento per ricontrollare se hai perso qualcosa.

Ad esempio, in un tutorial a nessuno interessa mantenere un riferimento al thread, ma nella vita reale, se qualcosa richiede abbastanza tempo da voler generare un thread, di solito richiede abbastanza tempo per poter essere in grado di cancellare il thread filo. Oppure, se hai una vita più breve, di solito generi una serie di discussioni che vorrai join prima di continuare. O vuoi assicurarti che la tua creazione di thread sia effettivamente riuscita. O vuoi assicurarti che il filo finisca pulito prima di uscire. Ottieni l'immagine.

    
risposta data 13.01.2012 - 04:32
fonte

Leggi altre domande sui tag