2011-02-28 10 views
11

que tiene un código como estepuntero a un entero en Java

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

pensé en hacer:

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

que reduciría el código de la mitad de las líneas, pero no lo hace de Java permitir punteros a enteros. Entonces, ¿hay alguna manera de abordar esto?

Editar: La tarea es mucho más grande que este método. Necesito crear una clase llamada "DoubleList" que contenga dos listas enlazadas en un solo Vector. Los enteros de los que hablo son los punteros al inicio de las listas, que necesito mover a otras posiciones de las listas al agregar o quitar elementos a las listas

Respuesta

5

Puede intentar usar el boxeo.

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

¿Por qué usarías tu propia clase en vez de usar la clase 'Integer'? – ubadub

+1

@ubadub Entero (y las otras clases primitivas de caja incorporadas) son inmutables. Eso es bueno cuando solo quieres poder usarlo en genéricos, pero no si quieres poder mutar el valor desde múltiples lugares. Dicho esto, también existe la clase 'AtomicInteger', que se puede compartir de forma segura entre hilos (pero es más lenta, ya que tiene que garantizar el comportamiento correcto de subprocesos múltiples). –

1

Utilice la clase Integer en lugar de una int.

Para dar un ejemplo usando el código que tiene:

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

¿Podría volver a escribir mi código con la clase Integer? No puedo entender cómo usarlo: s – bluehallu

+7

No creo que esto te haga ganar nada. Los enteros son inmutables. – DJClayworth

19

Tal vez me falta algo, pero se ve fácil solución para mí:

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; 
} 

Si no es necesario modifique las variables, luego puede omitir el valor de retorno (solo use void) y la asignación.

Si nada más necesita llamar al método, entonces debe ser private (es un principio general: dar el menor acceso posible, tanto como sea necesario).

+0

Bueno, esa es otra solución para mi ejemplo, es mi culpa por no pensar en la mejor, pero ¿no podría hacerse a mi manera? Quiero decir, ¿no hay nada como un puntero a un Entero en Java? – bluehallu

+0

@Hallucynogenyc: no existe un puntero a 'int' en Java. Los punteros solo existen para los tipos de referencia (es decir, no para los tipos primitivos) en cuyo caso se suelen llamar referencias (Advertencia: no actúan como referencias C, 'aunque!). Y el contenedor estándar para 'int' es inmutable, por lo que tener una referencia no ayuda. Podría usar un 'AtomicInteger' que es mutable. Sería una especie de "abuso" y su código se vería mucho menos claro (porque la tarea necesita una llamada 'set()' en lugar de un simple '='). –

+0

La situación real en mi caso es que la int con la que debo tratar es una variable de clase que simula un puntero, es tarea y debe estar en Java. No necesito solo el valor, esas líneas están modificando directamente esa variable. No puedo usar un método porque funcionaría para leer el valor, pero hay líneas que necesitan modificar ese entero. ¿Mejor ahora? – bluehallu

4

Sí, se llama "un método":

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

En realidad se llama "un método" ;-) –

+0

pero ... ¡Java no tiene funciones! ¡No confundamos al tipo C! : O – corsiKa

+0

@Joachim, @glowcoder: Es cierto, por supuesto, corregido. Gracias. – unwind

1

Por qué no puede usted acaba de hacer:

int a,b; 

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

Java no tiene punteros, tiene referencias.

Un puntero es una variable que contiene una dirección de memoria. Por lo general, uno desreferencia el puntero para obtener la memoria necesaria para alguna operación.

Una referencia es un índice en una tabla de gestión de memoria. Normalmente, la tabla de gestión de memoria está protegida contra el acceso directo. En el caso de Java, la referencia no se puede manipular manualmente, ya que cualquier lectura de la variable dará como resultado la devolución del objeto al que se hace referencia.

Esto tiene muchas implicaciones, pero es necesario para una recolección de basura automática decente. La recolección de basura a veces involucra mover objetos en la memoria para crear áreas más grandes de espacio libre (para objetos necesarios que no pueden caber en los agujeros de memoria actuales). Si Java expuso un puntero, luego de la compactación de la memoria, es posible que tenga la dirección "anterior" de la memoria.

Al usar referencias, se garantiza que su referencia permanecerá igual, incluso si la ubicación real de la memoria se mueve. Interna a la JVM es una referencia a la tabla de punteros, pero nunca podrá verla desde un programa en ejecución; porque, si alguna vez lo tocaste, arruinaría la gestión automática de la memoria.

+2

Más específicamente, Java tiene referencias de objeto. No tiene referencias de tipo primitivo. –

+0

Si Java no tiene punteros, ¿por qué tiene una 'NullPointerException'? ;-) Pero en serio, incluso las llamadas [JLS (§4.3.1)] (http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.1) dicen "El los valores de referencia (a menudo solo * referencias *) son punteros a estos objetos [..] ". –

+0

Porque alguien jodió el nombre de una clase. Las referencias son como punteros de alguna manera, pero a diferencia de otras, incluida lamentablemente la forma en que desea usarlas. – DJClayworth

0

Bueno, para este escenario:

boolean useA; 
int a, b; 

if(useA) 
     lots_of_lines_dealing_with_variable_a; 
else 
     same_lines_but_dealing_with_variable_b; 

que puede utilizar:

boolean useA; 
int a, b; 

int value = useA ? a : b; 

// lines_dealing_with_value 

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

Pero en realidad. Métodos!