2014-12-12 11 views
5

Ho una domanda per principianti. Ho cercato molto per la risposta ma non riesco a trovare la risposta esatta, quindi forse qualcuno con sviluppatori più esperti può aiutarmi con questo.Chiamare un metodo e passare un riferimento a un oggetto e rilevare il ritorno con lo stesso riferimento

Quindi, diciamo che avete una seguente situazione nel codice (questo è semplificato versione della situazione):

SomeObject a1 = new SomeObject(); 
a1 = someMethod(a1); 

public SomeObject someMethod(SomeObject a1) { 
a1.changeVariable(); 
return a1; 
} 

ora ho sentito da diverse persone dire che il superamento di un riferimento a un oggetto a un metodo e catturare il valore restituito è una cattiva pratica di codifica. Sfortunatamente nessuno può spiegarmi esattamente perché si tratta di una cattiva pratica di programmazione, e la mia ricerca della ragione non ha portato a nulla. Alcuni possono spiegare perché è una cattiva pratica fare questo? Non riesco a pensare a una situazione in cui qualcosa per questo possa andare storto.

Grazie in anticipo, voi bella gente mi hanno già aiutato con le risposte alle altre persone innumerevoli volte, si tratta di una prima volta ho davvero bisogno di inviare una domanda :)

+1

In questo non vedo una "cattiva pratica", soprattutto se si preferiscono oggetti immutabili. – Tom

+0

Qual è la necessità di restituire valore .. quando in realtà non ne abbiamo bisogno ??? – Srikanth

+0

@Srikanth Ad esempio: [Metodo concatenamento] (http://en.wikipedia.org/wiki/Method_chaining#Java). – Tom

risposta

5

Nello scenario avete dimostrato, ci non è un beneficio molto evidente. Tuttavia, come modello, può essere utile nella mia esperienza, in particolare se il metodo esegue la convalida.

Il metodo di Guava Preconditions.checkNotNull è un ottimo esempio di questo. Significa che posso scrivere codice come questo:

public class Player { 
    private final String name; 

    public Player(String name) { 
     this.name = Preconditions.checkNotNull(name); 
    } 
} 

... invece di dover dividere l'assegnazione e la convalida. Inoltre, consente la convalida di esistere come parte di un'altra chiamata, ad es. ad un altro costruttore:

super(Preconditions.checkNotNull(name)); 
+0

Ok, quindi stai dicendo che se usato correttamente, al di fuori della situazione immutabile, non c'è nulla di sbagliato nella scrittura di codice come questo.Inoltre, come hai citato sopra come un pattern, può avere alcuni vantaggi in termini di semplificazione (suppongo che il checkNotNull restituisca ciò che gli è stato passato, anche se in questo caso è un oggetto immutabile e otterremo invece un riferimento a un nuovo oggetto di quello che abbiamo passato). Ci scusiamo per queste domande che potrebbero sembrare stupide ma sto iniziando con Java e voglio avere una solida conoscenza delle basi sin dall'inizio. – Newbie

+0

@Newbie: nel tuo esempio tu * non * ottieni un riferimento a un nuovo oggetto. Stai restituendo lo stesso riferimento passato in esso. Sembra anche che tu abbia qualche equivoco su come i riferimenti e gli oggetti funzionano in Java. Nulla crea automaticamente copie di oggetti quando un riferimento viene passato in un metodo ... –

+0

sì, scusa stavo parlando del tuo esempio ma confuso con qualcosa che ho letto in un altro articolo [link] (http://stackoverflow.com/questions/1270760/passing-a-string-by-reference-in-java) – Newbie

Problemi correlati