2008-11-24 5 views
22

Si tiene una situación en la que necesita saber dónde no se configuró un valor booleano (por ejemplo, si ese valor no establecido debería heredar de un valor principal) la primitiva booleana Java (y el equivalente en otros idiomas) claramente no es adecuado.Mejor manera de definir el estado verdadero, falso o no configurado

¿Cuál es la mejor práctica para lograr esto? Defina una nueva clase simple que sea capaz de expresar los tres estados o use la clase Java Boolean y use null para indicar el estado desarmado?

+19

Me gusta http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx por supuesto :) –

+1

Me gustaría revocar ese comentario si pudiera. –

Respuesta

37
Boolean a = true; 
Boolean b = false; 
Boolean c = null; 

Yo usaría eso. Es el más directo.

Otra forma es usar una enumeración. Tal vez eso es aún mejor y más rápido, ya que no se requiere el boxeo:

public enum ThreeState { 
    TRUE, 
    FALSE, 
    TRALSE 
}; 

Existe la ventaja de la primera que los usuarios de su clase no tienen que preocuparse por su booleano de tres estados. Todavía pueden pasar true y false. Si no te gusta el null, ya que está diciendo poco acerca de su significado aquí, aún puedes hacer un public static final Boolean tralse = null; en tu clase.

+10

El sitio web diario de la WTF dice que el tercer valor debe llamarse "FILE_NOT_FOUND". Ver: http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx – Darron

+1

Me gustaría ir con el booleano, yo mismo. Todo el VERDADERO, FALSO, FILE_NOT_FOUND/TRALSE simplemente está pidiendo problemas. –

+0

Mal diseño. Haz un objeto tri-estado. Crea una instancia con el padre para automatizar la herencia de valores cuando se "desarma", de lo contrario el padre de prueba/uso se extenderá por todo tu código. –

10

Aunque no es específico de Java, mi preferencia en este caso es definir una clase o enumeración ThreeState y usarla, tal como lo mencionó, una verdadera, una falsa y una indefinida (o predeterminada, o no definida, como su terminología específica de dominio dicta). Se siente mejor, más natural y más autodocumentado que representando unset/undefined con null.

+0

Este es absolutamente el camino a seguir. Además, puede consultar el "Padre" en su clase para que pueda heredar automáticamente su estado. De lo contrario, tiene el código "heredar estado" extendido a lo largo de su código (no SECO). –

+0

Bill, ¿qué diablos quieres decir con "Padre"? –

-3

java.lang.Boolean hace esto por usted. Hay constantes estáticas Boolean.TRUE, Boolean.False.

private Boolean myBoolean;

debe ser todo lo que necesita. Tenga en cuenta que Boolean.TRUE pasará una prueba de equivalencia, pero es distinta de "verdadera" (que se autoboxa en TRUE).

8

El booleano anulable mi voto

1

Depende. Aquí mencionas que no estaría configurado si tiene que heredar su valor de un valor padre. ¿Tienes algún tipo de jerarquía de datos? Algo como esto:

Parent a { 
    boolean val = true; 
    boolean val2 = false; 
} 
Child b { 
    boolean val = false; 
    //here val2 should be unset! 
} 

En este caso, si es posible, yo diría que simplemente no incluyen val2 en el niño, y que su lógica de búsqueda sea tal que si no encuentra la variable, busca a los padres por el valor.

4

El uso de valores nulos para representar el estado de algo es un diseño deficiente. Es poco descriptivo y difícil de mantener. Preferiría tener un objeto de Estado con un estado predeterminado si no se ha establecido nada explícito en él. Por ejemplo:

if(state == null) { 
    doSomething(); 
} 

Esto no me dice nada sobre cuál es el estado esperado. Algo más como esto lo hace más claro.

if(state.awaitingSet()) { 
    doSomething(); 
} 

Sin mencionar extensible. ¿Qué sucede cuando necesita un cuarto estado?

-1

En la clase padre iniciado el booleano en null y en la clase de niño a desarrollar un método para comprobar para ver si el booleano se ha establecido

en la clase de padres

private Boolean a = null; 

public void setA(Boolean a) { 
    this.a = a; 
} 


public Boolean getA() { 
    return a; 
} 

En la clase hija

if (a == true) 
{ 
dothis; 
} 
else if (a == false) 
{ 
dothat; 
} 
else 
{ 
assert false : "Boolean a has not been set"; 
} 

Asegúrese de que las aserciones estén activadas. Las afirmaciones son solo para el ciclo de desarrollo y ciclo de prueba, no son para excepciones de tiempo de ejecución.

8

En Java 8, también existe la opción de Opcional:

public static final Optional<Boolean> TRI_TRUE = Optional.of(true); 
public static final Optional<Boolean> TRI_FALSE = Optional.of(false); 
public static final Optional<Boolean> TRI_UNKNOWN = Optional.empty(); 

Como beneficio adicional, usted recibirá todos los mapa y consumen métodos.

+0

Si no se puede usar Java 8 pero Guava está presente, se puede usar 'com.google.common.base.Optional' en su lugar. – thee

1

Simplemente usaría un int (integer) con valores de 0,1,2 y lo manejaría dentro del programa.

Cuestiones relacionadas