2012-05-28 19 views
9

Duplicar posible:
what happens to an object in Java if you do not reference it, like here : myString.concat(“that”)¿Por qué no es necesario asignar el valor de retorno de un método a una variable?

public class ReturnTest 
{ 
    public static void main(String[] args) 
    { 
     ReturnTest rt = new ReturnTest(); 
     rt.show(); 
    } 

    public String show() 
    { 
     return "Hello"; 
    } 
} 

En el código anterior el método show() devuelve un valor String que no está capturado por cualquier variable. Ni el compilador ni la JVM plantean ninguna advertencia, error o excepción de ningún tipo. Lo mismo es cierto para los tipos de retorno primitivos. ¿Por qué?

¿No debería el compilador asegurarse de que no se pierda ningún valor importante devuelto por un método?

¿Cómo puedo solucionar esto desde un depósito?

+1

¿Qué pasa si asigna el valor a una variable pero no la examina? ¿Qué pasa si lo examina, pero no toma la decisión "correcta" basada en ese examen? ¿Qué tan lejos quieres tomar esto, antes de que el compilador haga lo "correcto"? –

Respuesta

10

Este es el diseño del idioma.

En muchos casos, los métodos devuelven un valor que no le importa. Por ejemplo, StringBuilder.append() devuelve el objeto en sí.

Es cierto que en algunos casos se puede perder un valor de retorno importante. Por ejemplo, InputStream.skip(long n) devuelve la cantidad de bytes omitidos. Y read devuelve la cantidad de bytes leídos. Hay algunas herramientas (Checkstyle, FindBugs) que detectan dichos errores. Pero el lenguaje en sí no solicita verificar el valor de retorno. E incluso si lo hiciera, el programa podría elegir ignorar el valor.

+0

no estoy usando ningún IDE, ¿cómo puedo solucionar esto a través de un shell? – WickeD

+2

Puede ejecutar Checkstyle y FindBugs en la línea de comandos o como parte de la compilación. Pero, ¿por qué no solo usas un IDE? –

3

Porque no necesariamente necesita el valor devuelto.

+0

mi pregunta es ¿cómo se imagina Java que no necesitamos el valor devuelto? – WickeD

+0

no. Simplemente no está asignado. – Bozho

+2

Se supone que el programador sabe lo que está haciendo. Si no almacenan el valor devuelto, no lo necesitaban. –

1

Las funciones de Java no son puras, por lo que solo se pueden ejecutar para efectos secundarios. Es solo que en este caso no hay efectos secundarios ... Considere

public String show() { 
    System.out.println("Hello"); 
    return "Hello"; 
} 

¿Ahora desea una advertencia? El compilador no puede saber si lo estaba ejecutando por el efecto secundario o el valor, entonces, ¿por qué insistir?

3

Puede anotar un método con @CheckReturnValue si siempre se debe usar su valor de retorno. El análisis de código estático como FindBugs considera esta anotación y genera una advertencia cuando la viola.

Al menos esto es muy razonable cuando el método devuelve algún tipo de objeto que necesita el procesamiento final en el extremo de donde es responsable la persona que llama. Esto es cierto para los recursos que deben cerrarse al final. Bloqueos que se deben liberar al final ...

Cuestiones relacionadas