2011-02-03 31 views
9

Trong java, tôi có thể viết mã như thế nàyLớp trình bao bọc Java Boolean được khởi tạo như thế nào?

Boolean b = true ; 

Và nó sẽ hoạt động. Bây giờ tôi có một đối tượng chứa giá trị "true".

Cách thức hoạt động? Tại sao tôi không phải vượt qua giá trị thông qua một nhà xây dựng? Giống như vậy:

Boolean b = new Boolean(true) ; 

Ngoài ra, tôi có thể tạo các lớp tùy chỉnh mà tôi có thể tạo nhanh theo cách tương tự không? Nếu vậy cái gọi là gì?

Vì vậy mà tôi có thể làm điều gì đó như thế này:

Foobar foobar = "Test" ; 

Và như vậy, có lớp wrapper của riêng tôi.

Cảm ơn

+0

Đây được gọi là autoboxing. Googling 'java autoboxing' sẽ cung cấp nhiều thông tin về những gì bạn đang chứng kiến. –

+2

Phần sau cần nhiều máy móc hơn Java cung cấp. Trong scala, ví dụ này có lẽ có thể được thực hiện với implicits – svrist

+0

Cảm ơn tất cả mọi người, tôi chưa bao giờ nghe thuật ngữ "autoboxing" trước đây. – CrazyPenguin

Trả lời

13

Không, bạn không thể thực hiện việc sau.

Trước đây được gọi là autoboxing và được giới thiệu trong Java v1.5 để tự động quấn, nguyên thủy trong đối tác trình bao bọc của chúng.

Lợi ích từ autoboxing có thể rõ ràng được nhìn thấy khi sử dụng Generics và/hoặc các bộ sưu tập:

Từ bài viết: J2SE 5.0 in a Nutshell

Trong "autoboxing và Auto-Unboxing của các loại nguyên thủy" mẫu chúng tôi có:

Trước (autoboxing đã được bổ sung)

ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(0, new Integer(42)); 
int total = (list.get(0)).intValue(); 

Sau

ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(0, 42); 
int total = list.get(0); 

Như bạn thấy, mã này rõ ràng hơn.

Chỉ cần ghi nhớ những lưu ý cuối cùng trên tài liệu:

Vì vậy, khi bạn nên sử dụng autoboxing và unboxing? Chỉ sử dụng chúng khi có “sự không phù hợp trở kháng” giữa các kiểu tham chiếu và các kiểu nguyên thủy, ví dụ, khi bạn phải đặt các giá trị số vào một bộ sưu tập. Nó không thích hợp để sử dụng autoboxing và unboxing cho máy tính khoa học, hoặc mã số hiệu suất nhạy cảm khác. Một số nguyên không phải là một thay thế cho một int; autoboxing và unboxing làm mờ sự khác biệt giữa các kiểu nguyên thủy và các kiểu tham chiếu, nhưng chúng không loại bỏ nó.

1

Đó là cùng một cách mà bạn có thể làm cho đối tượng String như vậy:

String s = "foobar" 

Nó chỉ là một perk trong Java, thực sự. Tôi không chắc chắn lý do tại sao bạn sẽ muốn làm cho lớp wrapper của riêng bạn, hoặc là, xem xét rằng bất kỳ loại dữ liệu nguyên thủy đã có một wrapper được xác định trước ...

+0

Tôi không có nhu cầu thực tế về nó, nhưng tôi nhận ra mình không biết nó hoạt động như thế nào, và không biết cụm từ "autoboxing" có một vài tìm kiếm google không kết quả – CrazyPenguin

0

Nó được gọi là autoboxing và về cơ bản chỉ là thứ mà trình biên dịch thực hiện cho bạn. Nó chỉ được thêm vào trong Java 5, trước đó bạn đã phải sử dụng new Boolean(true), hoặc (tốt hơn) Boolean.TRUE.

Và không, bạn không thể có nó cho các lớp học của riêng bạn, nó chỉ được thực hiện cho các lớp wrapper nguyên thủy.

3

Cách thức hoạt động?

Đó là tính năng trình biên dịch. Trình biên dịch sẽ tự động tạo ra hoạt động boxing. Những gì nó sẽ thực sự làm là để tạo ra

Boolean.valueOf(true); 

Bởi vì cách này (bất biến) các trường hợp hiện Boolean.TRUE và Boolean.FALSE sẽ được sử dụng thay vì tạo một hình mới.

1

Tính năng này đã được thêm vào Java 1.5 và được gọi là Autoboxing. Loại ma thuật này chỉ có sẵn cho các giá trị nguyên thủy và các trình bao bọc thư từ.

Và bạn không thể tự làm điều đó trong Java. Nếu bạn vẫn muốn nó, hơn là đi cho Scala - nó tuyệt vời! Cụ thể là bạn có thể sử dụng tính năng được gọi là implicit conversions. Dưới đây là ví dụ nhỏ cho trường hợp của bạn:

case class Foobar(value: String) 
implicit def convertStringToFoobar(s: String) = Foobar(s) 
val foobar: Foobar = "Test"; 
Các vấn đề liên quan