es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sonarlint valor centinela falso positivo.

Tengo el siguiente fragmento de código, donde la herramienta SonarLint indica que mi variable booleana sentinel siempre se evalúa como verdadera, y la asignación sentinel = true es inútil.

import static java.lang.System.*;

public class Sentinel {

private static final int[] array = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

public static void main(String[] args) {
    boolean sentinel = false;
    int counter = 0;
    while (!sentinel) {
        out.println("Contador: " + counter);
        out.println("Índice del array: " + array[counter]);
        counter++;
        if (counter == array.length - 1) {
            out.println("Se alcanzó el final del array");
            sentinel = true;
            out.println("Rompiendo...");
            break;
        }
    }
}
}

¿Cuál podría ser el problema con el análisis de SonarLint? El código se compila perfectamente y se ejecuta como se espera.

Saludos.

Actualización:

Se han proporcionado dos respuestas valiosas de @kkk. A continuación, se muestra la que más me gustó:

import java.util.concurrent.atomic.AtomicBoolean;
import static java.lang.System.*;

public class Sentinel {

    private static final int[] array = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    public static void main(String[] args) {
        AtomicBoolean sentinel = new AtomicBoolean(false);
        int counter = 0;
        while (!sentinel.get()) {
            out.println("Contador: " + counter);
            out.println("Índice del array: " + array[counter]);
            counter++;
            if (counter == array.length - 1) {
                out.println("Se alcanzó el límite del contador");
                sentinel.set(true);
                out.println("Rompiendo...");
                break;
            }
        }
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el análisis de SonarLint es que no puede determinar la intención del código. La asignación sentinel = true puede parecer inútil para la herramienta, pero en realidad sirve como una forma de salir del bucle while cuando se cumple una condición. Sin embargo, en lugar de usar una variable boolean, se recomienda usar un método más seguro para hilos y eficiente como AtomicBoolean. Esto evitará posibles condiciones de carrera cuando varios hilos accedan a la variable, y también hará que el código sea más claro y fácil de entender. Aquí tienes un ejemplo de cómo usar AtomicBoolean en el código:

    import java.util.concurrent.atomic.AtomicBoolean;
    
    import static java.lang.System.*;
    
    public class Sentinel {
    
        private static final int[] array = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    
        public static void main(String[] args) {
            AtomicBoolean sentinel = new AtomicBoolean(false);
            int counter = 0;
            while (!sentinel.get()) {
                out.println("Contador: " + counter);
                out.println("Índice del array: " + array[counter]);
                counter++;
                if (counter == array.length - 1) {
                    out.println("Fin del array alcanzado");
                    sentinel.set(true);
                    out.println("Rompiendo...");
                    break;
                }
            }
        }
    }
    

    Este fragmento de código utiliza AtomicBoolean para manejar la variable sentinel, asegurando la seguridad en los hilos y evitando las advertencias de la herramienta SonarLint.

Comments are closed.