Công cụ sửa đổi của static static sau khi nhập khẩu có nghĩa là gì?


438

Khi được sử dụng như thế này:

import static com.showboy.Myclass;

public class Anotherclass{}

sự khác biệt giữa import static com.showboy.Myclassimport com.showboy.Myclass?

Câu trả lời:


390

Xem tài liệu

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

Vậy khi nào bạn nên sử dụng nhập tĩnh? Rất ít! Chỉ sử dụng nó khi bạn muốn khai báo các bản sao địa phương hoặc lạm dụng quyền thừa kế (Giao diện liên kết không đổi). Nói cách khác, sử dụng nó khi bạn yêu cầu truy cập thường xuyên đến các thành viên tĩnh từ một hoặc hai lớp. Nếu bạn quá lạm dụng tính năng nhập tĩnh, nó có thể làm cho chương trình của bạn không thể đọc được và không thể nhận biết được, 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 mà bạn nhập. Người đọc mã của bạn (bao gồm cả bạn, một vài tháng sau khi bạn viết nó) sẽ không biết thành viên tĩnh đến từ lớp nào. Nhập tất cả các thành viên tĩnh từ một lớp có thể đặ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 chúng riêng lẻ. Được sử dụng phù hợp, nhập tĩnh có thể làm cho chương trình của bạn dễ đọc hơn,


28
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 Assert của Junit : nhập org.junit.Assert tĩnh. * Cho tất cả các bài kiểm tra đơn vị của bạn.
BxlSofty

3
- để kiểm soát dán rất lâu và không thực sự bắt mắt tập tin tài liệu, thay vì viết giải thích đơn giản.
Błażej Michalik

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

1
@Ferrybig: Đó là một trích dẫn từ các tài liệu được liên kết.
Joshua Snider

Giống như includetrong Ruby!
Chloe

227

Không có sự khác biệt giữa hai nhập khẩu mà bạn nêu. Tuy nhiên, bạn có thể sử dụng nhập tĩnh để cho phép truy cập không đủ điều kiệ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 phải 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:

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

Bạn có thể xem thêm trong tài liệu .


57

Nhập tĩnh được sử dụng để nhập các trường / phương thức tĩnh của một lớp thay vì:

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 "nhập tĩnh org.example.Myclass;" Sẽ không hoạt động: nhập là dành cho lớp, nhập tĩnh là dành cho các thành viên tĩnh của một lớp.


37

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

Tôi sẽ giải thích quan điểm của tôi với 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ột mã, với 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));
  }
}

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


4
Nó có nghĩa là bất cứ điều gì để viết import static java.lang.Mathmà không có dấu hoa thị?
Chris Middleton

1
@AADEusDrZaius không, nhập tĩnh 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 tốt! Vì nhiều 'người mới' đọc bài đăng này, tuy nhiên, nên đưa ra một cảnh báo nhỏ: Đừng lạm dụng dấu hoa thị để ngăn ô nhiễm không gian tên.
goerlibe

24

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

Đầu tiên sẽ tạo ra một lỗi biên dịch vì nhập tĩnh chỉ hoạt động để nhập các trường hoặc cá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.*;

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


14

Việc này importcho phép lập trình viên java truy cập các lớp của gói mà không cần chứng nhận gói.

Các static importtính năng cho phép để truy cập vào các thành viên tĩnh của một lớp mà không cần trình độ lớp.

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

Thí 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 nhập tĩnh

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: Nhập tĩnh trong Java 5 là gì


2

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

Lưu ý: bạn cần thực hiện một import myPackage.MyClass hoặc myPackage.* để truy cập các tài nguyên khác


1

Công cụ staticsửa đổi sau importlà để lấy / sử dụng các trường tĩnh của một lớp. Một lĩnh vực mà tôi sử dụng import staticlà để lấy các hằng số từ một lớp. Chúng ta cũng có thể áp dụng import statictrên các phương thức tĩnh. Đảm bảo gõ import staticstatic importsai.

Những gì có static importtrong Java - JavaRevisited - Một tài nguyên rất tốt để biết thêm vềimport static.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.