2010-02-25 17 views

Respuesta

7

La asignación a una variable temporal antes de regresar le da la oportunidad de realizar una comprobación y corrección de errores desde su nueva persona(). Devolver la nueva llamada requiere que la persona que llama de su nuevo métodoPerson() capture y se recupere de los errores.

+2

Si se realizara un mayor acceso a la variable, no habría dudas ya que el escenario ya no existiría. – Robin

+0

Realmente, cuestionaría la existencia de este método por completo en una revisión del código. ¿Una nueva rutina de una línea *() para devolver a una persona con algunos valores predeterminados? Si no va a proporcionar alguna funcionalidad adicional sobre la llamada "nueva Persona()" con su rutina newPerson(), newPerson() es un método con IMO de utilidad limitada. ¿Por qué no simplemente tener un: public Person() {...} constructor? Lo mismo sin la capa de llamada de método. Son opciones igualmente pobres para un método, pero al menos la primera forma le da la oportunidad de hacer algo útil para el usuario que no llamaría a la persona nueva() por su propia cuenta. –

+0

El método en este ejemplo es trivial. Prefiero usar ejemplos simples sobre publicar un método real que estoy usando en el código en vivo. – mheathershaw

1

Nadie es más eficiente que el otro, el JIT se alineará con el más eficiente en tiempo de ejecución.

0

Uno no es más eficiente que el otro, pero devolver el objeto creado directamente es probablemente más limpio ya que está utilizando menos variables temporales. Si debe usar variables temporales, hágala final y nómbrela apropiadamente.

+0

Aclare dónde están las variables temporales. Siempre pensé que P se crea una instancia y que se devuelve una referencia a P. Si no declara P, se crea una instancia de un objeto y se pasa una referencia. –

+1

java pasa variables por VALOR hace que una copia de P y P caiga fuera del alcance en la devolución. –

+0

Lo que dijo @fuzzy. Un buen compilador puede optimizar la implementación, pero en lo que respecta al código fuente, 'p' es una variable temporal. Así es como se llama. Siempre lo ha sido, siempre lo será. – polygenelubricants

16

No hay ninguna diferencia que lo haga elegir uno sobre el otro en términos de rendimiento.

  • Por el bien de la depuración, la primera es mejor, es decir, cuando desea rastrear la ejecución, o registrar información entre la creación y la devolución.
  • En aras de la legibilidad (pero esto es subjetivo), este último es mejor.

En general, aconsejaría esto último, y siempre que necesite depurar esto, realice un cambio temporal a la primera variante (de dos líneas).

+0

Argumentaría que ninguno es más legible que el otro, entonces, ¿por qué hacer un cambio temporal? El código que el compilador JIT genera para cualquiera de los patrones es probable que sea 100% idéntico. Ninguna diferencia. Entonces, si el primer patrón tiene alguna ventaja, por mínima que sea, ¿por qué no usarlo (o al menos dejarlo una vez que haya realizado el cambio)? –

+2

bueno, para mí es más legible devolverlo de inmediato. Pero cuando se rastrea con un depurador, es mucho más conveniente tenerlo en dos líneas. Y tal vez log información de depuración en el medio. – Bozho

+3

Si optimiza la legibilidad o la capacidad de búsqueda de deudas, se podría argumentar que el código es leído (por los humanos) mucho más de lo que se depura. –

0

La segunda opción es más corta y más fácil de leer.

Dudo que cualquier compilador decente de Java crearía código menos eficiente para la primera opción.

1

En un mundo sano, compilarán exactamente el mismo código de bytes, por lo que son idénticos en lo que a rendimiento se refiere. A continuación, la única diferencia es que los seres humanos:

Creación de una variable temporal hace depuración poco más fácil: se puede poner un punto de interrupción en la instrucción de retorno e inspeccionar el valor de p. En la versión de una línea, esto es más difícil de hacer.

Hacerlo en una línea elimina una variable, lo que reduce la complejidad, por lo que el código un poco más fácil de leer.

En la práctica, lo escribiría en una línea, y en el peor de los casos creo una variable temporal si me encuentro con el problema de depuración. Además, ¿no se supone que las pruebas unitarias eliminan la necesidad de depuración? :-)

Cuestiones relacionadas