2010-06-23 16 views
8

que tienen¿Cuál es la posición correcta de los literales en la comparación de cadenas?

if (localName.equals("TaxName")) { 

pero PMD dice

Position literals first in String comparisons 
+1

Bueno, si el PMD se queja de los literales de estar a la derecha , No creo que tengas muchas más opciones que ponerlas a la izquierda (también conocido como [condición de yoda] (http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined/2430307#2430307) style) :) –

Respuesta

23

"TaxName".equals(localName) es mejor, como si localName es nulo no obtendrá una excepción de puntero nulo.

+4

Eso es solo mejor si quieres tenerlo en cuenta. Personalmente, no puedo recordar una situación en la que no haya habido un error en mi código que quisiera detectar lo antes posible. – Davor

+0

regex para reemplazar aquellos: '([a-zA-Z] [^] +) \. Equals \ ((" [^ "] *") \) ' Reemplazar con:' \ 2.equals (\ 1) ' – Kuronashi

5

prefiero literales primera posición, es decir:

if ("TaxName".equals(localName)) { ... 

Esta forma de hacer una comparación correcta para el caso de null, en vez de conseguir NullPointerException.

7

PMD también debería estar diciendo por qué genera esta advertencia. De the rules documentation en el sitio web del PMD:

literales primera posición en las comparaciones de cadenas - de esa manera si la cadena es nula no obtendrá una NullPointerException, sólo se volverán falso.

+1

En algunos casos, si una variable es nula, el código debe considerarla como desigual a una cadena. En otros casos, indica un problema y cuanto más rápido se marca el problema, mejor. En esta última situación,' variable .equals ("literal") 'es mejor, ya que atrapará si la variable es nula. – supercat

2

Personalmente, eso no tiene sentido para mí. Si el código captura una NullPointerException, entonces se hace un trabajo que no tendrá que hacer más tarde. Si localName termina siendo nulo, y eso causa un problema más adelante, entonces será más difícil rastrearlo. No cambie el código para hacer feliz al compilador. Si su código arroja una NullPointerException, entonces se le ahorrará tiempo de depuración más tarde.

+0

Estoy totalmente en desacuerdo y definitivamente prefiero escribir' CONSTANT.equals (variable) 'en lugar de hacer una verificación preliminar' null' –

+0

If localName es nulo e intenta usarlo más adelante obtendrá exactamente el mismo efecto que el código original, es decir, un NPE. Pero, lo que es más importante, uno siempre debe hacer feliz al compilador, sabe lo que hace. Incluso recomendaría ir a la configuración del compilador para su IDE de elección y actualizar todas las c advertencias de ompiler en errores. – CurtainDog

+1

@CurtainDog actualizando las advertencias del compilador a errores realmente retrasaría la productividad de mi empresa durante un año. Estoy seguro de que el 90% de las personas en SO estarían de acuerdo. No digo que no tengas razón en principio, porque esas advertencias se convierten en errores con demasiada frecuencia, solo digo que es más fácil decirlo que hacerlo. – corsiKa

-1

Para evitar esta advertencia, una solución más simple es nullpointers de verificación antes, cosa que se recomienda en todos los objetos que manejamos, no sólo en este mismo caso:

if (localName!=null && localName.equals("TaxName")) { 
    ... 
} 
Cuestiones relacionadas