2011-09-21 9 views
21

En C# puedo una variable para permitir nulos con el signo de interrogación. Quiero tener un resultado verdadero/falso/nulo. Quiero que esté configurado como nulo por defecto. El booleano se establecerá en verdadero/falso por un resultado de prueba, pero a veces la prueba no se ejecuta y un valor booleano es por defecto falso en Java, por lo que la tercera opción para probar sería agradable.¿Java permite tipos anulables?

C# ejemplo:

bool? bPassed = null; 

¿Tiene java tener algo similar a esto?

+4

Java tiene tipos de referencia anulables, pero no primitivas que aceptan nulos. – BoltClock

Respuesta

32

su lugar, puede utilizar la clase Boolean en caja (que es una clase ordinaria en lugar de un tipo primitivo), o una de tres valores enum.

+0

En otras palabras, "Sí", ya que la clase correspondiente actúa como el equivalente de C# (excepto que la versión de C# es una estructura, y la de Java es una clase). – ToolmakerSteve

+1

@ToolmakerSteve: No; no son lo mismo, de varias maneras. – SLaks

+1

@SLaks "no son lo mismo, de varias maneras" ¿puede proporcionar algunos ejemplos y/o un enlace relevante? Gracias. –

7

No, en java primitives no puede tener valor nulo, si desea esta característica, es posible que desee utilizar Boolean en su lugar.

12

puede utilizar:

Boolean b = null;

es decir, el objeto java.lang.Boolean en Java.

Y luego también establece cierto o falsa por una asignación simple:

Boolean b = true; o Boolean b = false;

5

En Java, los tipos primitivos no puede ser nulo. Sin embargo, puede usar Boolean y sus amigos.

2

No, pero se pueden usar Boolean clase en lugar de primitiva boolean tipo para poner null

7

Sí se puede.

Para hacer este tipo de cosas, java tiene una clase de contenedor para cada tipo primitivo. Si convierte su variable en una instancia de la clase contenedora, se le puede asignar null como cualquier variable normal.

En lugar de:

boolean myval; 

... se puede utilizar:

Boolean myval = null; 

puede asignarla como esto:

myval = new Boolean(true); 

... Y obtener su valor primitivo así:

if (myval.booleanValue() == false) { 
    // ... 
} 

Cada tipo primitivo (int, boolean, float, ...) tiene un tipo correspondiente de la envoltura (Integer, Boolean, Float, ...).

La característica autoboxing de Java permite que el compilador a veces fuerce automáticamente el tipo de envoltura en su valor primitivo y viceversa. Pero, siempre puedes hacerlo manualmente si el compilador no puede resolverlo.

0

Si está utilizando objetos, permite null

Si está utilizando tipos de datos primitivos, no no permitir null

que la razón Java tiene Wrapper Class

2

Claro que se puede ir con Boolean, pero para que sea más obvio que tu tipo puede tener "valor" o "sin valor", es muy fácil crear una clase contenedora que haga más o menos lo que hacen los tipos ? en C#:

public class Nullable<T> { 
    private T value; 
    public Nullable() { value = null; } 
    public Nullable(T init) { value = init; } 
    public void set(T v) { value = v; } 
    public boolean hasValue() { return value != null; } 
    public T value() { return value; } 
    public T valueOrDefault(T defaultValue) { return value == null ? defaultValue : value; } 
} 

A continuación, puede utilizar de esta manera:

private Nullable<Integer> myInt = new Nullable<>(); 
... 
myInt.set(5); 
... 
if (myInt.hasValue()) 
    .... 
int foo = myInt.valueOrDefault(10); 

Tenga en cuenta que algo como esto es habitual desde Java8: la clase Optional. https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html

Cuestiones relacionadas