2009-09-13 31 views
28

Tôi đã nghe nói về các loại được gọi là "đóng hộp" bằng một số ngôn ngữ.Điều gì có nghĩa là nói loại được "đóng hộp"?

Trong Java, tôi đã nghe nói về "autoboxing". Cái gì thế này? Nó có các lớp bao bọc cho một loại không? Mã của tôi sẽ thay đổi như thế nào nếu tôi đang làm việc với các loại đóng hộp hoặc không được hộp?

Trả lời

46

Một số loại dữ liệu được coi là "nguyên thủy", có nghĩa là chúng không được coi là đối tượng và không có các thuộc tính của đối tượng.

Trên hầu hết các nền tảng, số nguyên và ký tự là ví dụ về các loại nguyên thủy nhưng có thể được đóng hộp.

Đấm bốc nghĩa là gói chúng vào một vật thể để chúng có hành vi của một vật thể.

Ý nghĩa và hành vi chính xác tùy thuộc vào ngôn ngữ bạn đang sử dụng. Một số ngôn ngữ (như Smalltalk ... ít nhất là waaay trở lại khi tôi đang làm ...) không cho phép bất kỳ loại nguyên thủy nào và coi mọi thứ là đối tượng, nhưng có một hình phạt hiệu suất liên quan đến điều đó bởi vì, cuối cùng trong ngày, bộ xử lý cần làm việc với số nguyên và bộ nhớ thô để thực hiện công việc hữu ích. Nếu bạn muốn thêm hai số nguyên đã được đóng hộp, ví dụ, đằng sau hậu trường, chúng được "unboxed" thành các kiểu nguyên thủy, các số được thêm vào, và sau đó chúng được đóng lại vào một số nguyên mới.

3

Loại đóng hộp có nghĩa là các giá trị được phân bổ trong một khối trên heap và được tham chiếu thông qua một con trỏ. Điều này là tốt cho tính đồng nhất trong việc thực hiện thời gian chạy (nó làm cho nó dễ dàng hơn để có các chức năng chung, vv), với chi phí của một bổ sung.

0

Nói chung khi bạn làm việc với các bộ sưu tập, bạn đang xử lý các mảng đối tượng. Trong các ngôn ngữ như Java, có một sự khác biệt giữa một nguyên thủy và một đối tượng. Khi một nguyên thủy là "đóng hộp", nó về cơ bản chỉ là một wrapper quanh một nguyên thủy để nó chơi tốt đẹp với phần còn lại của khuôn khổ đó là mong đợi một đối tượng.

Autoboxing chỉ là hành động đưa một nguyên thủy vào một đối tượng hoặc kéo một nguyên thủy ra khỏi một đối tượng một cách minh bạch để bạn không phải lo lắng về bước bổ sung để tự làm.

12

Có, quyền anh có nghĩa là lấy một loại giá trị và gói nó trong một loại tham chiếu. Kể từ khi java giới thiệu autoboxing bạn có thể làm:

void foo(Object bar) {} 
//... 
    foo(1); 

Và java sẽ tự động chuyển int 1 thành số nguyên. Trong các phiên bản trước, bạn sẽ phải làm:

foo(new Integer(1)); 

autoboxing là hữu ích nhất trong java khi làm việc với Generics, vì bạn không thể sử dụng nguyên thủy với Generics, vì vậy để lưu trữ ints trong một danh sách, bạn phải để tạo một số List<Integer> và đặt int vào danh sách được đóng hộp.

11

thông tin cụ thể hơn cho Java:

autoboxing cho phép java để tự động chuyển đổi những thứ như booleanint với các phiên bản đối tượng của họ BooleanInteger tự động trong hầu hết các trường hợp. Nó cũng cho phép điều ngược lại xảy ra.

Ví dụ:

int a = 3; // no boxing is happening 
Integer b = 3; // newer versions of java automatically convert the int 3 to Integer 3 
int c = b; // these same versions also automatically convert Integer 3 to int 3 

Cũ hơn phiên bản của java không có autoboxing sẽ đòi hỏi mã này để làm điều tương tự:

int a = 3; // works the same 
Integer b = new Integer(3); //must set up a Integer object manually 
int c = b.intValue(); //must change Integer object to a primitive 

Tuy nhiên, có một số tình huống mà bạn vẫn có để làm mọi thứ theo cách thủ công. Ví dụ, hãy tưởng tượng bạn có một lớp học với hai phương pháp như vậy:

assertEquals(int a, int b); 
assertEquals(Object a, Object b) 

Bây giờ, nếu bạn cố gắng để làm điều này:

Integer a = 3; 
int b = 3; 
assertEquals(a, b); // this will not compile 

Lý do này không hoạt động là bởi vì nó không thể tìm ra có nên bỏ chọn a thành int hoặc hộp b thành số Integer. Vì vậy nó là mơ hồ mà phương pháp chữ ký nên được gọi là. Để khắc phục điều này, bạn có thể thực hiện một trong các cách sau:

assertEquals((int) a, b); 
assertEquals(a, (Integer) b); 
0

Đóng hộp có nghĩa là chúng lấy loại giá trị thông thường và tạo đối tượng xung quanh. Sắp xếp như đặt nó vào một cái hộp. Điều này thường tránh được, bởi vì chi phí của việc xây dựng đối tượng.

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