2011-02-28 10 views
11

Ho un codice come questopuntatore ad un intero in Java

int a,b; 
switch(whatever){ 
    case 1: 
     lots_of_lines_dealing_with_variable_a; 
    case 2: 
     same_lines_but_dealing_with_variable_b; 
} 

ho pensato di fare:

int a,b; 
pointer_to_int p; 
switch(whatever){ 
    case 1: 
     p=a; 
    case 2: 
     p=b; 
} 
lots_of_lines_dealing_with_pointer_p; 

ridurrebbe il codice per circa la metà delle linee, ma Java non lo fa consentire i puntatori ai numeri interi. Quindi, c'è un modo per avvicinarsi a questo?

Modifica: i compiti sono molto più grandi di questo metodo. Devo creare una classe chiamata "DoubleList" che contenga due elenchi collegati in un singolo vettore. Gli interi di cui parlo sono i puntatori all'inizio delle liste, che devo spostare in altre posizioni degli elenchi quando si aggiungono o rimuovono elementi negli elenchi

risposta

5

Si potrebbe provare a utilizzare la boxe.

public class IntBoxer { 
    public IntBoxer() { 
    } 
    public IntBoxer(int startValue) { 
     this.value = startValue; 
    } 
    public int value; 
} 
IntBoxer a = new IntBoxer(); 
IntBoxer b = new IntBoxer(); 
IntBoxer p; 
Switch(whatever){ 
    case 1: 
     p=a; 
     break; 
    case 2: 
     p=b; 
     break; 
} 
lots_of_lines_dealing_with_pointer_p.value; 
+0

Perché dovresti boxare usando la tua classe piuttosto che usare la classe 'Integer'? – ubadub

+1

@ubadub Integer (e le altre classi di box primitive incorporate) sono immutabili. Va bene quando vuoi essere in grado di usarlo in generici, ma non se vuoi essere in grado di mutare il valore da più posti. Detto questo, esiste anche la classe 'AtomicInteger', che può essere condivisa in modo sicuro tra i thread (ma è più lenta dal momento che deve garantire il corretto comportamento multi-thread). –

1

Utilizzare la classe Integer invece di un int.

Per darvi un esempio utilizzando il codice che avete:

Integer a,b; 
Integer p; 
switch(whatever){ 
    case 1: 
     p=a; 
    case 2: 
     p=b; 
} 
+0

Potresti riscrivere il mio codice con la classe Integer? Non riesco a capire come usarlo: s – bluehallu

+7

Non penso che questo ti guadagni qualcosa. I numeri interi sono immutabili. – DJClayworth

19

forse mi manca qualcosa, ma sembra facilmente risolvibili a me:

int a,b; 

switch(whatever) { 
    case 1: 
    a = manipulateValue(a); 
    break; 
    case 2: 
    b = manipulateValue(b); 
    break; 
} 

int manipulateValue(int v) { 
    // lots of lines dealing with variable v 
    return v; 
} 

Se non è necessario modificare le variabili, quindi è possibile tralasciare il valore di ritorno (basta usare void) e il compito.

Se nient'altro ha bisogno di chiamare il metodo, dovrebbe essere private (è un principio generale: dare il minimo accesso possibile, per quanto necessario).

+0

Bene, quindi questa è un'altra soluzione per il mio esempio, è colpa mia se non ci penso in una migliore, ma non si potrebbe fare a modo mio? Voglio dire, non c'è niente come un puntatore a un Integer in Java? – bluehallu

+0

@Hallucynogenyc: non esiste un puntatore a un 'int' in Java. I puntatori esistono solo per i tipi di riferimento (vale a dire non per i tipi primitivi), nel qual caso vengono solitamente chiamati riferimenti (Attenzione: non si comportano come riferimenti C, 'benchè!). E lo standard wrapper per 'int' è immutabile, quindi avere un riferimento ad esso non aiuta veramente. Potresti usare un 'AtomicInteger' che è mutabile. Sareste gentili di "abusarne" e il vostro codice sembrerebbe molto meno accurato (perché l'assegnazione richiede una chiamata 'set()' invece di un semplice '='). –

+0

La situazione reale nel mio caso è che l'int che devo affrontare è una variabile di classe che simula un puntatore, è compito a casa e deve essere in Java. Non ho bisogno solo del valore, quelle linee stanno modificando direttamente quella variabile. Non posso usare un metodo perché funzionerebbe per leggere il valore, ma ci sono linee che devono modificare quel numero intero. Meglio ora? – bluehallu

4

Sì, si chiama "un metodo":

private int lots_of_lines_dealing_with_value(int x) 
{ 
    . 
    . 
    . 
    return new_value; 
} 


int a,b; 
Switch(whatever){ 
    case 1: 
     p=lots_of_lines_dealing_with_value(a); 
     break; 
    case 2: 
     p=lots_of_lines_dealing_with_value(b); 
     break; 
} 
+3

In realtà si chiama "un metodo" ;-) –

+0

ma ... Java non ha funzioni! Non confondiamo il ragazzo C! : O – corsiKa

+0

@Joachim, @glowcoder: naturalmente, risolto. Grazie. – unwind

1

Perché non basta fare:

int a,b; 

Switch(whatever){ 
    case 1: 
     f(a); 
     break; 
    case 2: 
     f(b); 
     break; 
    default: 
     // ??? 
} 
1

Java non ha i puntatori, ha riferimenti.

Un puntatore è una variabile che contiene un indirizzo di memoria. In genere, si deruba il puntatore per ottenere la memoria necessaria per alcune operazioni.

Un riferimento è un indice in una tabella di gestione della memoria. In genere la tabella di gestione della memoria è protetta dall'accesso diretto. Nel caso di Java, il riferimento non può essere manipolato manualmente, poiché ogni lettura della variabile risulterà nel restituire l'oggetto di riferimento.

Questo ha molte implicazioni, ma è necessario per una garbage collection automatica decente. La raccolta dei dati inutili a volte comporta lo spostamento di oggetti nella memoria per creare aree più ampie di spazio libero (per gli oggetti necessari che non possono essere adattati ai fori di memoria correnti). Se Java ha esposto un puntatore, dopo la compattazione della memoria, potresti avere il "vecchio" indirizzo della memoria.

Utilizzando i riferimenti, il vostro riferimento è garantito per rimanere lo stesso, anche se la posizione effettiva della memoria si muove. Interno alla JVM è un riferimento alla tabella puntatore, ma non lo vedrai mai da un programma in esecuzione; perché, se mai lo avessi toccato, rovinerebbe la gestione automatica della memoria.

+2

In particolare, Java ha riferimenti a oggetti. Non ha riferimenti di tipo primitivi. –

+0

Se Java non ha puntatori, perché ha un 'NullPointerException'? ;-) Ma seriamente, anche le chiamate [JLS (§4.3.1)] (http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.1) dicono "Il i valori di riferimento (spesso solo * riferimenti *) sono puntatori a questi oggetti [..] ". –

+0

Perché qualcuno ha rovinato il nome di una classe. I riferimenti sono simili a dei puntatori in qualche modo, ma a differenza di essi in altri, incluso purtroppo il modo in cui li si desidera utilizzare. – DJClayworth

0

Bene, per questo scenario:

boolean useA; 
int a, b; 

if(useA) 
     lots_of_lines_dealing_with_variable_a; 
else 
     same_lines_but_dealing_with_variable_b; 

è possibile utilizzare:

boolean useA; 
int a, b; 

int value = useA ? a : b; 

// lines_dealing_with_value 

if(useA) 
    a = value; 
else 
    b = value; 

Ma in realtà. Metodi!

Problemi correlati