Static import trong Java

Static import là gì?

Static import là một khái niệm được giới thiệu trong phiên bản Java 1.5. Nhờ vào việc sử dụng static import chúng ta có thể sử dụng các biến, method static trong một class mà không cần chỉ định rõ class name trong code. Ví dụ như hàm sqrt() là một static trong Math class, thông thường chúng ta sử dụng hàm này bằng cách Math.sqrt(), nhưng với static import chúng ta có thể sử dụng method này mà không cần kèm theo class name sqrt().

Cách sử dụng static import

Theo SUN microSystem, việc sử dụng static import sẽ mã code trở nên rõ ràng hơn. Tuy nhiên hầu hết các lập trình viên Java có nhiều năm kinh nghiệm lại cho rằng việc sử dụng static import sẽ gây sự hiểu nhầm và nên hạn chế sử dụng. Cá nhân mình thấy việc sử dụng static import đôi lúc khiến code mình bị sai do sử dụng nhầm lẫn các biến, method static từ các class khác nhau vì những class này đều có cùng các biến, method static nhưng cách hoạt động lại khác nhau.

Ví dụ khi không sử dụng static import thì code của chúng ta sẽ như sau

class Example {
    public static void main(String[] args) {
        System.out.println(Math.sqrt(4));
        System.out.println(Math.pow(2, 2));
        System.out.println(Math.abs(6.3));
    }
}

Output

2.0
4.0
6.3 

Còn khi sử dụng static import 

import static java.lang.Math.*;
class Example {
    public static void main(String[] args) {
        System.out.println(sqrt(4));
        System.out.println(pow(2, 2));
        System.out.println(abs(6.3));
    }
}

Output

2.0
4.0
6.3 

Các lỗi phổ biến khi sử dụng static import

Như đã đề cập ở trên thì việc sử dụng static import có thể dẫn đến một số lỗi không mong muốn. Giả sử chúng ta có 2 class khác nhau nhưng có cùng một biến static thì trình biên dịch sử quăng lỗi khi sử dụng static import vì nó không biết nên sử dụng biến static của class nào trong trường hợp này.

import static java.lang.Integer.*;
import static java.lang.Byte.*;
class Example {
    public static void main(String[] args) {
        out.println(MAX_VALUE);
    }
}

Output

Error:Reference to MAX_VALUE is ambigious

Sự khác nhau giữa import và static import

Với import chúng ta có thể sử dụng bất kỳ class hoặc interface nào trong một package được import. Còn với static import chúng ta có thể truy cập các biến, method static của một class được import mà không cần chỉ định class name.

Việc sử dụng static import có một lý do lớn nhất là làm mã nguồn trở nên gọn và dễ dàng đọc hiểu hơn. Ví dụ như Math.sqrt() trông sẽ khó chịu hơn với sqrt().