2012-02-08 18 views
6

Duplicar posible:
Is there any performance reason to declare method parameters final in Java?
Why would one mark local variables and method parameters as “final” in Java?java: ¿Por qué la variable local debe ser declarada definitiva

estoy usando el PMD para ver las violaciónes de código.

dentro de un método webService, tengo este código a continuación

public ServiceRequest getData() 
{ 
Status status = new Status(); 
// code 
} 

Lo PMD me está sugiriendo es que, este estado variable local podría ser declarado como final.

Mi pregunta es, ¿si fuera definitiva daría como resultado mejoras en el rendimiento o, si no, qué beneficios podría obtener el código?

+0

Duplicado de http://stackoverflow.com/a/266981/259576 –

+0

Como se describe en [stackoverflow answers] (http://stackoverflow.com/questions/316352/why-would-one-mark-local-variables -and-method-parameters-as-final-in-java) el compilador puede producir código optimizado para un mejor rendimiento. – ChangeRequest

+0

Por favor, describa una * optimización * única que solo es posible si una variable local se declara definitiva, porque ciertamente no puedo pensar en ninguna y tampoco puedo ver una que se describa en su enlace. – Voo

Respuesta

1

No sé acerca de las ventajas de rendimiento al hacer que el estado sea definitivo, pero el PMD te lo sugiere, porque probablemente nunca escribirás sobre el estado después de su primera inicialización.

Así que lo que ganas por lo que es definitivo es que su código es menos propenso a errores - si se declara final, que no puede sobrescribir por error ...

4

Tomado del siguiente artículo: http://www.javapractices.com/topic/TopicAction.do?Id=23

  • comunica claramente su intención
  • permite que el compilador y máquina virtual para realizar optimizaciones menores
  • claramente banderas artículos que son más simples en el comportamiento - Final dice: "Si usted está buscando para los lexity, no lo encontrarás aquí ".

Esto también se discute en esta pregunta: Can excessive use of final hurt more than do good?

+1

'permite que el compilador y la máquina virtual realicen optimizaciones menores' - umn no, realmente no. ¿Qué tipo de optimización sería? – Voo

+2

He visto que el compilador de Sun emite un bytecode ligeramente más corto cuando la única diferencia entre los dos métodos ha sido la "finalidad" de las variables locales. Las micro-optimizaciones son reales, y los compiladores realmente las hacen. Lo que realmente importa, por supuesto, es qué hace el JIT con el bytecode, y las referencias locales pierden su "finalidad" cuando se compilan en bytecode. Creo que esta es la razón por la cual hay tanta especulación sobre las variables locales finales: es bastante determinista cuáles son los resultados. Sin embargo, el uso de locales finales puede afectar el bytecode, por lo que vale. –

+0

El bytecode generado por javac no codifica que una variable sea definitiva. El JIT no tiene idea de que la variable fue una vez final. –

4

final indica que no se puede cambiar la variable local. Mi opinión es que los métodos deben ser tan cortos que puedas comprenderlos fácilmente y, por lo tanto, hacer que la variable sea definitiva puede ser un poco redundante.

Prefiero hacer los campos final porque hacer que toda la clase sea tan corta, es una seria limitación. También los campos pueden tener problemas de seguridad de subprocesos que las variables locales no tienen.

+0

Estoy de acuerdo. La única razón por la que uso locales finales es cuando uso clases anónimas (pero tampoco porque yo ** quiera **). Y dudo de los beneficios de rendimiento reclamados: no veo qué información adicional obtenemos allí. – Voo

+0

El JIT es lo suficientemente inteligente como para calcular que la variable es definitiva, así que dudo que mejore mucho el rendimiento. El compilador 'javac' también debe ser lo suficientemente inteligente como para resolver que una variable es efectivamente definitiva (es decir, nunca ha cambiado) y no la necesita para las clases anónimas en mi humilde opinión. Las variables 'finales' son útiles en métodos grandes y complejos, pero la solución real es volver a factorizar el código para que no tenga grandes métodos complejos. ;) –

+1

Como no tenemos referencias en Java, no veo cómo el final cambia el código de ninguna manera. Considere: 'int x = 10', x será 10 siempre y cuando no asignemos x un nuevo valor * dentro del método en sí * (ok, sí, el compilador/JIT tiene que comprobar si no hacemos eso, pero eso es obvio para comprobar). Sí, podría ser útil para otros programadores, pero todos estamos de acuerdo en que si un método es tan largo y complicado que no vemos todas las asignaciones variables de un vistazo, tenemos un problema mucho mayor;) – Voo

Cuestiones relacionadas