2010-12-12 15 views
10

Come sappiamo, entrambe le lingue sono pass-by-value quando si passano i parametri ai metodi. Ma C# supporta le parole chiave ref e out per il pass-by-reference dei tipi primitivi. Sto cercando le stesse parole chiave e la stessa tecnica in Java?Rif e out di C# in Java

La mia ipotesi sta usando Integer classe wrapper invece di int in Java per passare.

Eventuali suggerimenti ed esempi?

risposta

12

tua ipotesi è corretta. È necessario un wrapper (ma non intero poiché è immutabile).

Alcune persone usano array di elementi singoli per questo scopo:

int[] x = { 0 }; 
int[] y = { 0 }; 
someMethod(x, y); 
return x[0] + y[0]; 

Molti saranno rango che la tecnica proprio lì con GOTO.

Alcune persone definiscono una classe di supporto generico:

public class Holder<T> { 
    private T _value; 
    private Holder(T value) { _value = value; } 
    public static of(T value) { return new Holder<T>(value); } 
    public T getValue() { return _value; } 
    public void setValue(T value) { _value = value; } 
} 

... 

Holder<String> x = Holder.of("123"); 
Holder<String> y = Holder.of("456"); 
someMethod(x, y); 
return x.getValue() + y.getValue(); 

Alcuni definiscono un tipo appositamente costruito:

SomeMethodResult result = someMethod(x, y); 
return result.getX() + result.getY(); 

Alcuni potrebbero organizzare il lavoro da fare all'interno del metodo, evitando la necessità per argomenti di riferimento in primo luogo:

return someMethod(x, y); 

Ognuna di queste tecniche s ha vantaggi e svantaggi:

  • matrici: semplice vs.brutto, si basa su array di avere esattamente un elemento
  • titolare: sicuro contro verbose, boxe
  • appositamente costruito Tipo: sicuro contro verbose, possibile eccessivo
  • metodo di modifica: sicuro, pulito vs non sempre è possibile

Personalmente, penso che Java abbia incasinato questo. Preferisco evitare gli argomenti di riferimento, ma vorrei che Java permettesse più valori di ritorno da un metodo. Ma, sinceramente, non inciampo su questo molto spesso. Non darei un rene per questa funzione. :)

+0

Mi piace la tecnica di 'int []'. L'ho provato e ha funzionato bene. Grazie. – Tarik

+0

+1 Risposta completa e sono praticamente d'accordo con l'ultimo paragrafo. – BoltClock

+0

IMO 'int []' è brutto ma non vicino a "' goto' -level ". È hackerare la mancanza di una funzionalità linguistica (reale pass-by-reference) nel modo più semplice, il che rende praticamente la stessa cosa di "passare per puntatore" in C. Non ne abbiamo bisogno come spesso in Java come in C, ma fondamentalmente è solo per il modo in cui i due linguaggi si occupano della gestione della memoria e, a livello più concettuale, della "gestione degli oggetti". –

5

Java non supporta questa funzione.

+0

+1. Breve e al punto :-) – Joey

1

Java non supporta il passaggio di tipi primitivi per riferimento.

Avvolgere un int come Integer non è d'aiuto, poiché è un tipo immutabile (vale a dire non può essere modificato una volta creato).

1

Java non ha questo built-in. Integer non lo farà, perché è immutabile. Non puoi cambiare il suo stato.

Dovrai creare la tua classe wrapper mutabile. Ma questo è molto "pericoloso" e può portare a risultati inaspettati, quindi cerca di evitarlo.

1

L'unico modo per passare valore indietro è passare un riferimento a un valore mutabile come

public void calc(int[] value) { value[0] = 1; } 
public void calc(AtomicInteger value) { value.set(1); } 

tuttavia la cosa più semplice da fare è quello di restituire tutti i valori modificati

public int calc() { return 1; }