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.

¿Existe una manera de hacer que mi objeto nunca sea nulo?

Se me dio una tarea y no estoy seguro de cómo hacer que funcione. Todos los casos de prueba deben pasar.

Assertions.assertDoesNotThrow(() -> p3.equals(null));
Assertions.assertFalse(p3.equals(null), “equals to null should return false”);

Ya resolví el primero, el que me está engañando es el Assertions.assertfalse(p3.equals(null)).
Creé el objeto p3 como Punto de la siguiente manera:

Punto p3 = new Punto(x + 1, y – 1);

En mi clase Punto tengo un método equals que anulo de la siguiente manera:

@Override
public boolean equals(Object obj) {
Punto p = (Punto) obj;
try {
if (x != p.x) {
return false;
}

    if (y != p.y) {
        return false;
    }
} catch (NullPointerException e) {
    System.err.println("null");
}
return true;

}

Usé esto para pasar otras pruebas no mencionadas.

public Punto(int x, int y) {
this.x = x;
this.y = y;
}

public int x() {
return x;
}

public int y() {
return y;
}

Donde x e y son enteros aleatorios entre 0 y 30.

Cuando ejecuto la prueba, siempre devuelve p3 igual a null, lo cual me confunde. Sé que tiene algo que ver con verificar si el objeto pasado es del mismo tipo (Punto) y downcasting, pero no estoy seguro.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema tiene que ver con la implementación del método equals en la clase Point. En el caso en el que obj es nulo, se produce una NullPointerException que se imprime, pero el método aún devuelve true. Esto significa que p3 se considera igual a null, lo cual no es el comportamiento deseado.

    Para solucionar este problema, el método equals debería primero comprobar si el objeto pasado es nulo y devolver false en ese caso. Además, dado que el método intenta hacer una conversión de tipo (downcast) del objeto a un Point, debería comprobar si el objeto es una instancia de la clase Point antes de intentar la conversión. Una implementación actualizada podría ser la siguiente:

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof Point)) {
            return false;
        }
        Point p = (Point) obj;
        return x == p.x && y == p.y;
    }
    

    Esta implementación primero comprueba si obj es nulo, y si lo es, devuelve false. Luego comprueba si obj es una instancia de Point, y si no lo es, también devuelve false. Finalmente, hace la conversión (downcast) del objeto a Point y compara las coordenadas x e y. Si son iguales, el método devuelve true, indicando que los dos puntos son iguales.

    Con esta implementación actualizada, la aserción Assertion.assertFalse(p3.equals(null), “equals to null should return false”) debería pasar porque está comprobando que p3 no es igual a null.

Comments are closed.