2011-06-04 12 views
8

Soy un principiante en Java. Intento, con fines formativos, construirme una aplicación de juego de ajedrez. Dentro de mi clase Case, que será utilizada para instanciar los 64 casos de mi placa, escribo get/set methods para encontrar si hay un ocupante Piece en las instancias del caso.Java - Obtener/configurar métodos que reciben y devuelven "nulo"

He leído que devolver "nulo" es una mala práctica, por lo que arrojo una excepción para indicar que el caso es gratuito. Pero, me pregunto cómo configurar el puntero del ocupante a "nulo"; ¿Puedo simplemente presionar "nulo" como parámetro cuando llamaré a este método?

Además, ¿podría tomar/devolver "nulo" una buena/aceptable práctica?

public Piece getOccupant(){ 
    if (this.occupant == null) 
     throw new IllegalArgumentException(this.occupant + " is Empty"); 
    return this.occupant; 
} 
public void setOccupant(Piece newOccupant){ 
    this.occupant = newOccupant; 
} 

Gracias!

[Actualización]

Gracias a todas sus por sus comentarios, ideas, correcciones y recomendaciones. Aquí está la versión actualizada de mi código para esta parte, y me siento satisfecho con ella, ya que cumplió su propósito (aumentar mi comprensión a través de la práctica).

/* 
* Modifiers of Occupant 
*/ 
/** 
* Used to find if a Piece is located in this Cell 
* @return a Piece reference to the occupant. Will send a 
* null pointer if cell is empty 
*/ 
public Piece getOccupant(){ 
    return this.occupant; 
} 
/** 
* Used to set a new occupant in the Cell. 
* @param newOccupant is a reference to a Piece instance, 
* and should be set to null if the cell is emptied, or using 
* the method clear(). 
*/ 
public void setOccupant(Piece newOccupant){ 
    this.occupant = newOccupant; 
} 
/** 
* Used to verify if a Cell is empty of any occupant 
* @return true if cell is empty. 
*/ 
public boolean isEmpty(){ 
    if(this.occupant == null) 
     return true; 
    return false; 
} 
/** 
* Free the cell of any occupant, if any were 
*/ 
public void clear(){ 
    this.occupant = null; 
} 
+5

Tal vez me equivoque, pero no veo por qué sería malo para volver nulo en esta situación si la celda no tiene ocupantes. 1+ para su deseo de escribir un mejor código! –

+5

Quizás sea solo yo, pero arrojar una IllegalArgumentException en un método que no tiene ningún argumento no es apropiado. – gouki

+0

No tiene una API que puede devolver nulo. Esto significa que deberá verificarlo cada vez que lo use. –

Respuesta

10

Un espacio en el tablero que está desocupado no es excepcional. Es normal y siempre será cierto para la mayoría del tablero. No deberías estar lanzando excepciones aquí; Las excepciones solo deben arrojarse para un evento inesperado que signifique un problema significativo con lo que está tratando de hacer.

Sin duda puede pasar nulo a un setter (a excepción de un tipo primitivo como int/long).

Podría ser mejor añadir algunos métodos de conveniencia, un método estaVacia a su clase de espacio:

public boolean isEmpty(){ 
    if (this.occupant == null) 
     return true; 
    return false; 
} 

y quizá también un método claro

public void clear() { 
    this.occupant = null; 
} 

de esa manera usted no tiene que pruebe la nulidad del resultado getter, y no necesita pasar el valor nulo para establecerlo; esto tiene los beneficios adicionales de ser fácilmente comprobable y crea una API que es significativa para su clase Space.

+0

Además, si su implementación cambia, solo necesita cambiar la verificación nula en una ubicación en lugar de refactorizar cada método de llamada. – crasic

+0

Puede simplificar la función isEmpty(): public boolean isEmpty() { return this.occupant == null; } –

3

¿Dónde leíste esa recomendación? En mi opinión, no hay absolutamente nada de malo en devolver null, siempre que null transmita información útil y no indique una condición de error grave. En este caso, es perfectamente normal que una celda de ajedrez no contenga una pieza, y definitivamente esperaría que getOccupant() devuelva nulo en ese caso.

6

Si desea prohibir a los valores nulos, debe hacerlo en el método de selección:

public void setOccupant(Piece occupant) { 
    if (occupant == null) throw new NullPointerException("occupant"); 
    this.occupant = occupant; 
} 

Tenga en cuenta que algunas personas prefieren tirar IllegalArgumentException. De cualquier manera, el punto es "fallar rápido" tan pronto como alguien establece un valor prohibido.

Habiendo dicho todo eso, un tablero de ajedrez ciertamente puede tener posiciones vacías, por lo que permitir el nulo parece tener más sentido.

Le sugiero que lea "Effective Java, 2nd Edition" de Josh Bloch.

+1

+1 para el libro al que se hace referencia. –

1

Si la persona que llama conoce los valores de retorno NULL, no es malo devolver los valores NULL por medio de callee.

1

En lugar de devolver nulo o lanzar una excepción, debe crear una clase "Vacío", "Ninguna", "Anulado", algo así, que asignaría a todas sus Casos que estén vacías.

0

pequeña sugerencia hay necesidad de si el bloque, se puede simplificar el código simplemente volviendo la salida de expresión

public boolean isEmpty(){ 
    return this.occupant == null 
} 
Cuestiones relacionadas