2011-09-21 28 views
21

Trong C# tôi có thể biến để cho phép null bằng dấu chấm hỏi. Tôi muốn có một kết quả true/false/null. Tôi muốn nó được đặt thành null theo mặc định. Boolean sẽ được đặt thành true/false bởi một kết quả thử nghiệm, nhưng đôi khi thử nghiệm không chạy và boolean là mặc định là false trong java, do đó, tùy chọn thứ 3 để kiểm tra sẽ tốt hơn.Java có cho phép các kiểu nullable không?

C# Ví dụ:

bool? bPassed = null; 

Liệu java có bất cứ điều gì tương tự như này?

+4

Java có các loại tham chiếu có thể vô hiệu hóa, nhưng không có các giá trị gốc null. – BoltClock

Trả lời

32

số

Thay vào đó, bạn có thể sử dụng Boolean lớp đóng hộp (đó là một lớp học bình thường chứ không phải một loại nguyên thủy), hoặc một ba giá trị enum.

+0

Nói cách khác "Có", vì lớp tương ứng hoạt động giống như tương đương C# (ngoại trừ phiên bản C# là một cấu trúc và phiên bản Java là một lớp). – ToolmakerSteve

+1

@ToolmakerSteve: Không; chúng không giống nhau, theo một số cách. – SLaks

+1

@SLaks "chúng không giống nhau, theo một số cách" bạn có thể cung cấp một vài ví dụ và/hoặc liên kết có liên quan không? Cảm ơn. –

7

Không, trong java primitives không thể có giá trị null, nếu bạn muốn tính năng này, bạn có thể muốn sử dụng Boolean để thay thế.

12

bạn có thể sử dụng:

Boolean b = null;

có nghĩa là, đối tượng java.lang.Boolean trong Java.

Và rồi cũng đặt đúng hoặc sai bởi một nhiệm vụ đơn giản:

Boolean b = true; hoặc Boolean b = false;

5

Trong Java, các kiểu dữ liệu không thể được null. Tuy nhiên, bạn có thể sử dụng Boolean và bạn bè.

2

Không nhưng bạn có thể sử dụng Boolean lớp thay vì nguyên thủy boolean loại để đưa null

7

Có bạn có thể.

Để làm điều này, java có lớp trình bao bọc cho mọi kiểu nguyên thủy. Nếu bạn biến biến của bạn thành một thể hiện của lớp bao bọc, nó có thể được gán null giống như bất kỳ biến bình thường nào.

Thay vì:

boolean myval; 

... bạn có thể sử dụng:

Boolean myval = null; 

Bạn có thể gán nó như thế này:

myval = new Boolean(true); 

... Và nhận được giá trị nguyên thủy của nó như sau:

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

Mọi loại nguyên thủy (int, boolean, float, ...) có loại trình bao bọc tương ứng (Integer, Boolean, Float, ...).

Tính năng autoboxing của Java cho phép trình biên dịch đôi khi tự động ép buộc loại trình bao bọc thành giá trị nguyên thủy của nó và ngược lại. Tuy nhiên, bạn luôn có thể thực hiện thủ công nếu trình biên dịch không thể tìm ra được.

0

Nếu bạn đang sử dụng đối tượng, nó cho phép null

Nếu bạn đang sử dụng nguyên thủy các loại dữ liệu, nó không phép null

Đó là lý do Java có Wrapper Class

2

Chắc chắn bạn có thể đi với Boolean, nhưng để làm cho nó rõ ràng hơn rằng loại của bạn có thể có "giá trị" hoặc "không có giá trị", nó rất dễ dàng để làm cho một lớp bao bọc mà nhiều hơn hoặc ít hơn những gì ? loại làm trong 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; } 
} 

Sau đó, bạn có thể sử dụng nó như thế này:

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

Lưu ý rằng một cái gì đó như thế này là tiêu chuẩn kể từ Java8: lớp Optional. https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html

Các vấn đề liên quan