2008-10-02 19 views

Trả lời

306

Xem Documentation

Tờ khai nhập khẩu tĩnh là tương tự như tờ khai nhập khẩu bình thường. Trong trường hợp bình thường tờ khai nhập khẩu nhập khẩu các lớp học từ gói, cho phép chúng được sử dụng mà không cần trình độ chuyên môn gói, tĩnh tờ khai nhập khẩu hàng nhập khẩu thành viên tĩnh từ các lớp học, cho phép họ sẽ được sử dụng mà không cần lớp trình độ .

Vậy khi nào bạn nên sử dụng tính năng nhập tĩnh? Rất ít! Chỉ sử dụng nó khi bạn muốn nếu không bị cám dỗ tuyên bố địa phương bản sao của các hằng số hoặc lạm dụng kế thừa (Giao diện Hằng số Antipattern). Nói cách khác, sử dụng nó khi bạn yêu cầu quyền truy cập thường xuyên vào thành viên tĩnh từ một hoặc hai lớp học . Nếu bạn lạm dụng tính năng nhập tĩnh, nó có thể làm cho chương trình không thể đọc được và không thể duy trì của bạn, gây ô nhiễm không gian tên của nó với tất cả các thành viên tĩnh bạn nhập. Độc giả của mã của bạn (bao gồm cả bạn, một vài tháng sau khi bạn đã viết) sẽ không biết lớp nào là thành viên tĩnh đến từ. Nhập tất cả các thành viên tĩnh từ một lớp học có thể là đặc biệt có hại cho khả năng đọc; nếu bạn chỉ cần một hoặc hai thành viên, hãy nhập riêng lẻ. Sử dụng một cách thích hợp, nhập tĩnh có thể làm cho chương trình của bạn dễ đọc hơn, bằng cách xóa bản mẫu được lặp lại của tên lớp.

+19

Tôi hoàn toàn đồng ý với các cảnh báo ở trên bởi @xsl. Một lĩnh vực mà nó chắc chắn rất hữu ích là cho Assit của junit: _import static org.junit.Assert. * _ Cho tất cả các bài kiểm tra đơn vị của bạn. –

+3

- để kiểm soát dán tệp tài liệu rất dài và không thực sự bắt mắt, thay vì viết giải thích đơn giản. –

+0

@xsl Có phải phần dưới của bài đăng phải nằm trong một khối trích dẫn không? có vẻ như bạn đã gõ nó. – Ferrybig

48

nhập tĩnh được sử dụng để nhập khẩu/phương pháp của một lớp thay vì lĩnh vực tĩnh:

package test; 

import org.example.Foo; 

class A { 

B b = Foo.B_INSTANCE; 

} 

Bạn có thể viết:

package test; 

import static org.example.Foo.B_INSTANCE; 

class A { 

B b = B_INSTANCE; 

} 

Nó rất hữu ích nếu bạn thường được sử dụng một hằng số từ một lớp khác trong mã của bạn và nếu nhập tĩnh không mơ hồ.

Btw, trong ví dụ của bạn "import static org.example.Myclass;" sẽ không hoạt động: nhập cho lớp, nhập tĩnh là cho các thành viên tĩnh của một lớp.

182

Không có sự khác biệt giữa hai lần nhập này mà bạn nêu. Tuy nhiên, bạn có thể sử dụng tính năng nhập tĩnh để cho phép truy cập không đủ tiêu chuẩn vào các thành viên tĩnh của các lớp khác.Nơi tôi đã từng có để làm điều này:

import org.apache.commons.lang.StringUtils; 
     . 
     . 
     . 
if (StringUtils.isBlank(aString)) { 
     . 
     . 
     . 

tôi có thể làm điều này:

21

sự khác biệt giữa "khẩu com.showboy.Myclass tĩnh" và "nhập khẩu com.showboy.Myclass "?

Đầu tiên sẽ tạo ra lỗi trình biên dịch vì nhập tĩnh chỉ hoạt động để nhập trường hoặc loại thành viên. (Giả sử MyClass không phải là một lớp bên trong hoặc thành viên từ showboy)

Tôi nghĩ bạn có nghĩa là

import static com.showboy.MyClass.*; 

mà làm cho tất cả các lĩnh vực tĩnh và các thành viên từ MyClass sẵn trong đơn vị biên dịch thực tế mà không cần phải hội đủ điều kiện cho họ .. Như đã giải thích ở trên

32

Ý tưởng cơ bản về nhập tĩnh là bất cứ khi nào bạn đang sử dụng lớp tĩnh, biến tĩnh hoặc enum, bạn có thể nhập chúng và tự lưu từ một số thao tác nhập.

Tôi sẽ giải thích điểm của mình bằng ví dụ.

import java.lang.Math; 

class WithoutStaticImports { 

public static void main(String [] args) { 
    System.out.println("round " + Math.round(1032.897)); 
    System.out.println("min " + Math.min(60,102)); 
} 
} 

Cùng mã, với hàng nhập khẩu tĩnh:

import static java.lang.System.out; 
import static java.lang.Math.*; 

class WithStaticImports { 
    public static void main(String [] args) { 
    out.println("round " + round(1032.897)); 
    out.println("min " + min(60,102)); 
    } 
} 

Note: nhập tĩnh có thể làm cho mã của bạn khó hiểu để đọc.

+3

Nó có nghĩa là bất cứ điều gì để viết 'java.lang.Math tĩnh' nhập khẩu mà không có dấu hoa thị? –

+1

@AmadeusDrZaius nope, nhập tĩnh là chỉ dành cho các thành viên tĩnh của một lớp. – Harry

+1

Câu trả lời hay! Vì nhiều 'newbies' đọc bài viết này nên có một cảnh báo nhỏ: ** Đừng lạm dụng dấu hoa thị ** để ngăn ngừa ô nhiễm không gian tên. – goerlibe

2

Giả sử bạn có các trường tĩnh và phương thức bên trong một lớp được gọi là myClass bên trong một gói có tên myPackage và bạn muốn truy cập chúng trực tiếp bằng cách nhập myStaticField hoặc myStaticMethod mà không cần nhập mỗi lần myClass.myStaticField hoặc myClass.myStaticMethod.

Lưu ý: bạn cần phải làm một myPackage.MyClass nhập hoặc mypackage * để truy cập vào các nguồn lực khác

12

Các import cho phép các lập trình viên java để lớp truy cập của một gói mà không cần bằng cấp gói..

Tính năng static import cho phép truy cập các thành viên tĩnh của một lớp học mà không có chứng chỉ của lớp học.

import cung cấp khả năng truy cập vào các lớp và giao diện trong khi static import cung cấp trợ năng cho các thành viên tĩnh của lớp học.

Ví dụ:

Với nhập khẩu

import java.lang.System.*;  
class StaticImportExample{ 
    public static void main(String args[]){ 

     System.out.println("Hello"); 
     System.out.println("Java"); 

    } 
} 

Với tĩnh nhập khẩu

import static java.lang.System.*;  
class StaticImportExample{ 
    public static void main(String args[]){ 

    out.println("Hello");//Now no need of System.out 
    out.println("Java"); 

} 
} 

Xem thêm: What is static import in Java 5

1

Sửa đổi static sau import để truy xuất/sử dụng các trường tĩnh của một lớp. Một vùng mà tôi sử dụng import static là để lấy các hằng số từ một lớp. Chúng tôi cũng có thể áp dụng import static trên phương pháp tĩnh. Đảm bảo nhập import staticstatic import sai.

What is static import in Java - JavaRevisited - Một tài nguyên rất tốt để biết thêm về import static.