2013-01-10 40 views
8

xem xét ví dụ đơn giản mã sau đây:nhập tĩnh mà không cần tên gói

public class TestStaticImport { 
    static enum Branches { 
     APPLE, 
     IBM 
    } 
    public static void doSomething(Branches branch) { 
     if (branch == APPLE) { 
      System.out.println("Apple"); 
     } 
    } 
} 

Nếu chúng tôi sẽ cố gắng để biên dịch mã này, chúng tôi sẽ nhận được thông báo lỗi:

java: cannot find symbol 
    symbol: variable APPLE 
    location: class TestStaticImport 

này có thể được giải quyết bằng cách giới thiệu nhập tĩnh này enum:

import static ... TestStaticImport.Branches.*

Nhưng trong thời điểm này mọi thứ không thể hiểu được (cho tôi) bắt đầu:

giải pháp này hoạt động tốt, mọi thứ đều tốt biên soạn, cho đến khi lớp TestStaticImport sẽ được chuyển thành gói gốc trống, tức là không có bất kỳ

package blablabla; ở đầu tệp java này;

dòng

Code: import static TestStaticImport.Branches.*; được đánh dấu như mã hợp lệ trong IDEA Intellij của tôi (tên của IDE không quan trọng, chỉ cần cung cấp thông tin), nhưng khi tôi cố gắng biên dịch mã như sau lỗi xuất hiện:

java: package TestStaticImport does not exist

Vì vậy, có thực sự là hai câu hỏi:

1) câu hỏi chính: tại sao nó không thể import static từ thư mục trống rỗng?

2) Cách khác (nếu có) cho phép tham chiếu mã vào các trường của enum chỉ sử dụng tên của chúng (ví dụ: APPLE thay vì Branches.APPLE), ngoại trừ nhập tĩnh?


P.S. Xin vui lòng, đừng nói với tôi, rằng các gói rỗng là phong cách xấu xí và vân vân. Câu hỏi này chỉ là vấn đề lý thuyết.

+0

Tôi đã gặp phải vấn đề tương tự như bạn cho câu hỏi đầu tiên ... Theo như tôi có thể nhìn thấy nó là một hạn chế. – fge

Trả lời

11

Các Java language specification cấm bất kỳ hàng nhập khẩu từ các gói giấu tên:

Một loại trong một gói giấu tên (§7.4.2) không có tên kinh điển, vì vậy yêu cầu đối với một tên kinh điển trong tất cả các loại nhập khẩu khai báo ngụ ý rằng (a) loại trong một gói chưa đặt tên không thể được nhập khẩu, và (b) thành viên tĩnh của các loại trong một gói chưa đặt tên không thể được nhập khẩu. Như vậy, §7.5.1, §7.5.2, §7.5.3, và §7.5.4 tất cả yêu cầu biên dịch lỗi khi cố gắng nhập một loại (hoặc thành viên tĩnh của chúng) trong gói chưa được đặt tên .

+0

Và số liên quan là 7.5.3/4. – assylias

+0

Vâng, cảm ơn bạn rất nhiều cho câu trả lời chính xác với liên kết đến đặc điểm kỹ thuật! – Andremoniy

5

Trong thời cổ đại, các nhà phát minh Java phải lập bản đồ các loại Java thành tệp để trình biên dịch có thể thực hiện một số công việc thực tế. Họ quyết định ánh xạ các gói vào các thư mục và các loại tệp. Điều đó làm việc khá tốt. Nó đặc biệt thiết lập nền tảng cảm xúc cho những người mới đến: "Tôi ghét bạn. Đừng gây rối với tôi." Nhưng tôi lạc đề.

Gói mặc định là một vấn đề, vì nó không có thư mục được xác định rõ.Nếu bạn có gói com, bạn biết rằng có một thư mục com ở đâu đó nhưng tên của thư mục cho gói mặc định là gì?

Vì vậy, các nhà thiết kế đã quyết định rằng import và gói mặc định không kết hợp. Trên thực tế, bạn gặp lỗi khi cố gắng nhập bất kỳ thứ gì không có gói (ví dụ: import TestStaticImport mà không có static* cũng sẽ không thành công). Xem How to import a class from default package

Vì vậy, sự cố không phải là nhập tĩnh nhưng bạn cố gắng nhập từ gói mặc định.

Giống như một số trường hợp góc khác trong Java, không có giải pháp.

also see: In Java- "Static Members of the default package cannot be imported"- Can some one explain this statement?

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