2015-01-06 16 views
7

quindi ho appena visto questo codice al lavoro e l'autore mi ha detto che è per l'ottimizzazione in linea.L'ottimizzazione inline Java è corretta?

Class Test{ 
... 
void init(){ 
    //sets variables, call functions, etc 
} 
... 
} 

poi chiama in Main Ti piace questa

Test t=new Test(); 
t.init(); 

Invece di avere un costruttore di default con il codice da init() in esso. Mi ha detto che è per l'ottimizzazione in linea. È corretto? Come è più veloce? dove leggo di questo?

+4

Chiedi all'autore. –

+4

Nulla ottimizza nulla nel tuo codice .. – Maroun

+0

Come si suppone che funzioni? – Natix

risposta

14

Non è più veloce. Sembra essere basato sul presupposto che un metodo può essere in linea ma un costruttore non può. Sfortunatamente non ha senso, quindi l'intero punto esce dalla finestra.

Anche se fosse più veloce, sarebbe quasi certamente una cattiva idea. Il codice non dovrebbe essere ottimizzato a scapito della leggibilità, tranne in circostanze estreme in cui ogni ultimo ciclo della CPU è critico, e in tal caso è improbabile che si stia utilizzando Java.

In realtà, questo è peggio di essere solo più difficile da leggere. Il prossimo refactoring sarà inevitabilmente per il costruttore Test per chiamare il metodo init(), in modo che non debba essere sempre fatto manualmente (e farlo manualmente è un problema e una potenziale fonte di bug se viene dimenticato); ed è una cattiva pratica se un costruttore chiama un metodo che può essere sovrascritto, perché una sottoclasse potrebbe inavvertitamente cambiare ciò che accade al momento della costruzione quando viene chiamato il costruttore della superclasse (vedere this question per maggiori dettagli). Quando questo accade, una sottoclasse di Test all'interno dello stesso pacchetto sarà in grado di eseguire l'override del metodo init(), e poi quando la sottoclasse invoca super(), implicitamente o esplicitamente, il costruttore della superclasse finirà chiamando il sovrascrittoinit(). (Questo particolare problema potrebbe essere eliminato dichiarando init() per essere private.)

Non farlo.

+0

Cosa succederebbe se ci fossero 2 costruttori?Sarebbe più facile da leggere se entrambi chiamassero il metodo init – JClassic

+0

_In assenza_ il metodo 'init' sta facendo qualcosa di multithread (come registrare' this' come listener su qualche altro thread, iniziare un nuovo thread che sa 'this', etc), nel qual caso si deve mantenere 'init()' separato per sicurezza thread. – yshavit

+2

@JClassic Un modo semplice per gestirlo è creare un costruttore "canonico" (possibilmente privato, se necessario) e fare in modo che gli altri costruttori lo invochino tramite 'this (someArg, anotherArg, maybeSomeArg + 42)'. – yshavit

1

Non penso che tu abbia nulla da ottimizzare. Detto questo, non penso che sia una buona idea in fase di progettazione o perché l'inizializzazione della classe è qualcosa che ogni classe deve fare da sola. Posizionamento di tale comportamento in un metodo separato che:

  1. deve essere richiamato separatamente
  2. possono a loro volta essere anche sovrascritti

è qualcosa che di solito non è raccomandato.