2011-02-24 11 views
5
  1. ¿Cuál es el efecto de no captar el valor del método que devuelve un valor?Java return Issue

  2. Desarrolla complicaciones como problemas de memoria si el valor de retorno no se detecta.

fragmentos de código de ejemplo:

//reference types 
public Object[] thismethodreturnsvalue(){ 
    return new Object[]{new Object(),new Object(),new Object()}; 
} 

//primitive types 
public int thismethodreturnsint(){ 
    return -1; 
} 

public static void main(String a[]){ 
    thismethodreturnsvalue(); 
    thismethodreturnsint(); 
} 

Respuesta

3

1. ¿Cuál es el efecto de no controlar el valor de la método que devuelve un valor?

No hay efecto realmente.

El valor de retorno se calculará, y si se creó en el montón (como en su primer ejemplo), será elegible para la recolección de basura de inmediato.

En su segundo ejemplo, el valor de retorno terminará en la pila y simplemente se descartará después de que el método haya regresado.

2. ¿Desarrolla complicaciones como problemas de memoria si el valor de retorno no se detecta?

No, realmente no. Como dije antes, será basura recolectada.

Aquí es un vertedero de código de bytes de lo que ocurre en el lugar de llamada:

public class Test { 

    public static int testMethod() { 
     return 5; 
    } 

    public static void main(String[] args) { 
     testMethod(); 
    } 
} 

... correspondiente código de bytes:

public static int testMethod(); 
    Code: 
    0: iconst_5 
    1: ireturn 


public static void main(java.lang.String[]); 
    Code: 
    0: invokestatic #2; 
    3: pop     // return value popped immediately. 
    4: return 
} 
+0

Gracias por las vívidas respuestas. Con mucho gusto apreciado. –

-1

no hay ninguna consecuencia a esto en la JVM. No puede estar claro si no está utilizando el valor de retorno, ya que solo está llamando al método por sus efectos secundarios.

Si lo hace con regularidad es cuestionable; por ejemplo, en su ejemplo, su método devuelve lo que parece un código de error; si va a ignorar el código de error, al menos debería documentarlo.

+2

No estoy de acuerdo. ¿Con qué frecuencia revisa el valor devuelto por Map.put() o Set.add()? Hay muchas llamadas API que devuelven algunos datos informativos adicionales que pueden o no ser valiosos para su caso de uso. Tratar de documentar cada instancia en la que ignore un valor de retorno sería bastante engorroso. – rfeak

2
  1. No hay ningún efecto. Si acaba de ejecutar un método para los efectos secundarios y no el valor de retorno, todo lo que sucederá es que se hagan los efectos secundarios.

  2. Nope. El valor de retorno se marca para la recolección de basura inmediatamente.

1

Nada malo sucede simplemente porque se pierde el valor de retorno. Pero, en algunos casos, puede indicar un mal uso o una mala comprensión de la API (por ejemplo, String.replace()).

0

El valor de retorno se asignará cuando se llama, pero ya que no tendrá referencias a ella, será elegible para la recolección de basura

0

Es bastante raro, si un método devuelve un valor, sin embargo, la persona que llama lo ignora.

En términos generales, los métodos tienen dos utilidades, uno para la consulta del estado del sistema, uno para el cambio de estado del sistema.

Algunos argumentan que un método sólo debe hacer una de las dos cosas, pero no ambos. Un método de consulta no debe cambiar el estado del sistema y debe devolver un valor. Un método de actualización no debe devolver un valor. Para averiguar el nuevo estado del sistema después de llamar a un método de actualización, llame a un método de consulta.

En este paradigma, sin duda es un error ignorar un valor de retorno - si no para conseguir el valor de retorno, el (consulta) llamada al método es totalmente falso.

Ese paradigma no es lo adoptamos sin embargo. Tenemos métodos que mezclan dos servicios juntos. También hay métodos que devuelven valores por otras razones extrañas, como esos "métodos fluidos". Por lo tanto, a veces es legítimo ignorar los valores de retorno del método.