2009-02-25 8 views
5

Được rồi, vì vậy nếu tôi đã có một dự án mà sử dụng:Điều gì sẽ làm cho tệp Lớp lớn hơn? nhập khẩu java.awt. *, hoặc một bó hoặc báo cáo nhập khẩu duy nhất?

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Color; 
import java.awt.Polygon; 

Nó sẽ làm cho các tập tin lớp nhỏ hơn để sử dụng:

import java.awt.* 

Tôi đang nghĩ đến chống lại nó bởi vì tôi đang nhập khẩu rất nhiều những thứ tôi không cần. Tôi đang suy nghĩ vì nó khiến cho tệp có ít ký tự hơn.

+0

Thao tác này sẽ giúp nhiều người chuyển từ C/C++ sang Java. –

Trả lời

16

Không có sự khác biệt. Đây chỉ là một cấu trúc biên dịch.

1

Tôi nghĩ rằng Java chỉ bao gồm những thứ bạn thực sự cần ... Vì vậy, sẽ không có bất kỳ sự khác biệt nào trong phiên bản được biên dịch cuối cùng bằng cách sử dụng một cách khác.

2

Thành thật mà nói, tại sao bạn quan tâm đến kích thước tệp lớp học của mình?

Thực tiễn tốt hơn là bao gồm tất cả các lớp cần thiết thay vì thực hiện "nhập foo.bar. *".

Điều đó làm cho mã của bạn dễ đọc hơn và dễ bảo trì hơn.

1

Không có thay đổi nào trong tệp lớp được tạo.

Nhập chỉ ảnh hưởng đến trình biên dịch (có thể mất nhiều thời gian hơn nếu nó phải lập chỉ mục nhiều thư mục) và, tất nhiên, trên mã nguồn (IMO dễ bảo trì hơn khi bạn có thể thấy chính xác các lớp được sử dụng).

3

Câu lệnh Java import không thêm bất kỳ kích thước nào vào tệp lớp. Nó cho phép trình biên dịch suy ra tên nào đề cập đến lúc biên dịch.

Sự khác biệt duy dòng

import java.util.*; 

làm là bạn có thể viết:

Set<String> set; 

hơn:

java.util.Set<String> set; 
11

Không, không có sự khác biệt ở tất cả.

Theo The Java Virtual Machine Specifications, Second Edition, Chapter 5: Loading, Linking and Initializing nói như sau:

Các máy ảo Java động tải (§2.17.2), liên kết (§2.17.3), và khởi (§2.17.4) các lớp học và các giao diện . Đang tải là quá trình tìm biểu diễn nhị phân của loại hoặc loại giao diện có tên riêng là và tạo một lớp hoặc giao diện từ biểu thức nhị phân đó . Liên kết là quá trình khi tham gia lớp học hoặc giao diện và kết hợp nó vào trạng thái thời gian chạy là máy ảo Java sao cho nó có thể được thực thi.

Tại thời điểm biên dịch, không có liên kết lớp học, do đó, sử dụng ký tự đại diện cho import ing không có sự khác biệt. Các lớp khác không được gộp chung vào tệp class kết quả.

Trong thực tế, nếu bạn nhìn vào bytecode của tập tin class (thông qua javap hoặc disassembler như vậy), bạn sẽ không tìm thấy bất kỳ import báo cáo, vì vậy có nhiều hoặc số ít import báo cáo trong mã nguồn của bạn sẽ không ảnh hưởng đến kích thước của tệp class.

Đây là một thử nghiệm đơn giản: Thử viết chương trình và biên dịch với import s bằng ký tự đại diện và một số khác có nhập khẩu rõ ràng. Tệp class kết quả phải có cùng kích thước.


Sử dụng rõ ràng import báo cáo về các lớp học cụ thể có lẽ ít có thể đọc được (và phiền hà, nếu người ta không sử dụng một IDE như Eclipse mà sẽ viết nó cho bạn), nhưng sẽ cho phép bạn để đối phó với sự chồng chéo của lớp tên trong hai gói.

Ví dụ: có một lớp List trong cả hai gói java.utiljava.awt. Bằng cách nhập cả gói, sẽ có một cuộc xung đột cho các lớp có tên List:

import java.util.*; 
import java.awt.*; 

// ... snip ... // 

List l; // which "List" are we talking about? 

bởi chỉ nhập khẩu các lớp cụ thể mà bạn cần, những xung đột có thể phần nào tránh được:

import java.util.Hashmap; 
import java.awt.List; 

// .. snip ... // 
List l; // Now we know for sure it's java.awt.List 

Tất nhiên, nếu bạn phải sử dụng cả hai số java.util.Listjava.awt.List thì bạn sẽ không may mắn; bạn sẽ cần sử dụng một cách rõ ràng tên lớp học đầy đủ của họ.

0

Không có sự khác biệt như đã nêu trong bài viết trước đây, tuy nhiên như một sở thích tôi sử dụng nhập khẩu nghiêm ngặt như tôi thấy nó làm theo ý kiến ​​của tôi mã pleasent hơn để đọc

0

Trong bổ sung cho câu trả lời trước đó, sự khác biệt duy bạn sẽ thấy là biên dịch phải nhanh hơn bit, khi bạn nói rõ ràng những gì bạn muốn import ed, thay vì đưa ra một ký tự đại diện, có thể bao gồm hàng nghìn (khi hàng nghìn) gói và gói không cần thiết.

1

Đầu tiên, hãy chắc chắn nhìn vào tôi "Import on Demand là ác!" Bài chi tiết:

http://javadude.com/articles/importondemandisevil.html

Bạn nên bao giờ sử dụng cú pháp *! Điều này có thể khiến chương trình của bạn ngừng biên dịch khi mã được thêm vào một thư viện khác!

Bây giờ đây là cách nhập khẩu thực sự hoạt động:

Khi bạn nói

import a.b.c.Foo; 

tất cả điều này là nói với trình biên dịch rằng khi bạn nói "Foo", bạn thực sự có nghĩa là "a.b.c.Foo". Trình biên dịch sau đó sẽ thay thế tất cả các lần xuất hiện của Foo bằng a.b.c.Foo trong bytecode được tạo ra.

Khi bạn nói

import a.b.c.*; 

này nói với trình biên dịch "khi bạn nhìn thấy một biểu tượng XXX bạn không nhận ra, hãy kiểm tra xem nếu có một abcXXX" Nếu tìm thấy, trình biên dịch sẽ thay thế XXX với abcXXX trong bytecode được tạo.

Nếu nhiều lần nhập "*" khớp với một biểu tượng không xác định, bạn sẽ gặp lỗi biên dịch cho sự mơ hồ.