Biến tĩnh là biến thuộc về lớp, không thuộc về bất kỳ đối tượng cụ thể nào của lớp đó. Chúng chỉ được tạo một bản sao và chia sẻ giữa tất cả các đối tượng của lớp đó.
Bạn nên sử dụng biến static khi
Dữ Liệu Chia Sẻ: Khi bạn muốn chia sẻ dữ liệu giữa tất cả các đối tượng của lớp, ví dụ như đếm số lượng đối tượng đã được tạo.
public class Counter {
private static int instanceCount = 0;
public Counter() {
instanceCount++;
}
public static int getInstanceCount() {
return instanceCount;
}
}
public class Main {
public static void main(String[] args) {
Counter obj1 = new Counter();
Counter obj2 = new Counter();
Counter obj3 = new Counter();
System.out.println("Number of instances: " + Counter.getInstanceCount()); // Kết quả: 3
}
}
Biến instanceCount là biến tĩnh, không thuộc về đối tượng cụ thể nào mà thuộc về lớp. Nó giúp đếm số lượng đối tượng đã được tạo và chia sẻ thông tin này giữa tất cả các đối tượng của lớp Counter.
2. Phương Thức Tĩnh (Static Methods)
Phương thức tĩnh là phương thức thuộc về lớp, không phải của các đối tượng cụ thể. Bạn có thể gọi các phương thức tĩnh trực tiếp từ tên lớp mà không cần tạo đối tượng.
Bạn nên sử dụng method static khi:
Hàm Tiện Ích (Utility Functions): Các hàm dùng chung không liên quan trực tiếp đến các đối tượng cụ thể, ví dụ như các hàm tính toán.
Factory Methods: Các phương thức để tạo đối tượng mà không cần tạo mới đối tượng từ bên ngoài, giúp quản lý việc tạo đối tượng một cách linh hoạt.
public class MathUtility {
public static double calculateSquare(double num) {
return num * num;
}
}
public class Main {
public static void main(String[] args) {
double result = MathUtility.calculateSquare(5);
System.out.println("Square: " + result); // Kết quả: 25
}
}
Phương thức calculateSquare là một hàm tiện ích không liên quan trực tiếp đến đối tượng cụ thể nào mà chỉ thực hiện tính toán và trả về kết quả dựa trên tham số đầu vào.
3. Khối Mã Tĩnh (Static Blocks):
Khởi Tạo Dữ Liệu Tĩnh: Nếu bạn cần khởi tạo các biến tĩnh hoặc thực hiện các hành động khởi tạo khác chỉ một lần cho toàn bộ lớp.
public class DatabaseConfig {
private static String databaseURL;
static {
// Khối mã tĩnh: Khởi tạo thông tin kết nối cơ sở dữ liệu
databaseURL = "jdbc:mysql://localhost:3306/mydatabase";
// Thực hiện các thao tác khởi tạo khác...
}
public static String getDatabaseURL() {
return databaseURL;
}
}
public class Main {
public static void main(String[] args) {
String url = DatabaseConfig.getDatabaseURL();
System.out.println("Database URL: " + url); // Kết quả: jdbc:mysql://localhost:3306/mydatabase
}
}
Khối mã tĩnh được sử dụng để khởi tạo dữ liệu tĩnh như kết nối cơ sở dữ liệu, và thực hiện các thao tác khởi tạo khác chỉ một lần cho toàn bộ lớp.
II. Khi nào nên tránh dùng static
Đa Luồng (Multithreading): Sử dụng static có thể gây xung đột dữ liệu khi làm việc với đa luồng.
Unit Testing: Static có thể gây khó khăn trong việc kiểm tra đơn vị (unit testing) do chúng liên kết với lớp và không dễ dàng thay thế hay giả lập.
Cuối cùng, trước khi sử dụng static, cân nhắc xem liệu việc chia sẻ dữ liệu hoặc chức năng chung đó thực sự cần thiết và phù hợp với thiết kế của ứng dụng hay không. Sử dụng static một cách cẩn thận sẽ giúp mã nguồn dễ đọc, dễ bảo trì và linh hoạt hơn.