Cách tạo biến toàn cục
Biến toàn cục là các biến có thể truy cập được từ mọi nơi trong ứng dụng. Nói cách khác, phạm vi của chúng là toàn bộ ứng dụng. Để tạo một biến như vậy trong Java, bạn cần tạo một biến tĩnh công khai trong một lớp công khai:public class Example {
public static int a;
public static int b;
public static String str;
}
Các biến a
và b
- str
đã trở thành toàn cục. Chúng ta có thể truy cập chúng trực tiếp từ các lớp khác trong ứng dụng:
public class GlobalVarsDemo {
public static void main(String[] args) {
Example.a = 4;
Example.b = 5;
Example.str = "Global String variable value";
System.out.println(Example.a);
System.out.println(Example.b);
System.out.println(Example.str);
}
}
Nếu chúng ta chạy phương thức này main
, chúng ta sẽ thấy kết quả như sau:
4
5
Global String variable value
Biến toàn cục có thể được chia thành 2 loại:
- các biến có thể được chỉnh sửa;
- các biến chỉ có thể được đọc.
final
và gán giá trị cho nó khi xác định biến:
public class Constants {
public static final double PI = 3.1415926535897932384626433832795;
public static final String HELLO_WORLD_STR = "Hello, World!";
}
Theo quy ước đặt tên Java, tất cả các hằng số phải được đặt tên bằng chữ in hoa, phân tách các từ bằng ký tự gạch dưới. Vì vậy, chúng tôi đã tạo các hằng số và bây giờ chúng tôi sẽ không thể thay đổi giá trị của chúng: Tuy nhiên, chúng tôi có thể đọc giá trị của chúng:
public class HelloWorld {
public static void main(String[] args) {
System.out.println(Constants.HELLO_WORLD_STR);
}
}
Phần kết luận:
Hello, World!
public class ConstantsDemo {
public static void main(String[] args) {
double r = 10;
String message = String.format("Площадь круга с радиусом %f=%f", r, getCircleSquare(r));
System.out.println(message);
}
static double getCircleSquare(double r) {
return Constants.PI * r * r;
}
}
Phần kết luận:
Площадь круга с радиусом 10,000000=314,159265
Bạn có nên sử dụng các biến toàn cục?
Có rất nhiều bài viết trên Internet, thông điệp chính là: các biến toàn cầu là xấu xa, xấu xa và khủng khiếp. Có thực sự vậy không? Hãy thử đưa ra những ưu và nhược điểm của các biến toàn cục để mọi người có thể tự rút ra kết luận. Hãy bắt đầu với những nhược điểm. Hãy tưởng tượng một ứng dụng có một lớp với các biến toàn cục có thể đọc và chỉnh sửa. Theo thời gian, số lượng lớp trong dự án, số lượng biến toàn cục và các phương thức sử dụng biến toàn cục, hay nói cách khác, phụ thuộc vào chúng, sẽ tăng lên. Theo thời gian, mỗi biến toàn cục được đọc ở các phần khác nhau của hệ thống cho các mục đích khác nhau. Ở các phần khác nhau của hệ thống, giá trị của một biến có thể được cập nhật. Bức tranh tổng thể về thế giới của ứng dụng này trở nên phức tạp hơn đáng kể và điều này dẫn đến những nhược điểm sau :- Giảm khả năng đọc và tăng độ khó trong việc hiểu mã.
- Tăng độ phức tạp của việc bảo trì mã.
- Để thay đổi một biến toàn cục, cần phân tích toàn bộ mã để không đặt biến đó thành giá trị không hợp lệ đối với các phần khác của hệ thống.
- Gia tăng các lỗi rất khó gỡ lỗi.
Hãy tưởng tượng một biến toàn cục, một mảng các đối tượng. Ví dụ: trong một phần của hệ thống, các chuỗi được mong đợi trong mảng này và trong một phần khác của hệ thống, ai đó đã quyết định sử dụng số dấu phẩy động. Có lẽ không ai muốn hiểu điều này.
- Tên biến có thể giống nhau nếu bạn sử dụng biến toàn cục trong mã của mình, cũng như một số thư viện cũng sử dụng biến toàn cục. Điều này có thể dẫn đến lỗi ở cả phía ứng dụng của bạn và phía thư viện bạn đang sử dụng.
- Tăng khả năng kết nối giữa các phần khác nhau của hệ thống sử dụng các biến toàn cục. Ngược lại, bạn nên cố gắng ghép mã lỏng lẻo. Sẽ tốt hơn nếu có nhiều hệ thống con nhỏ được kết nối lỏng lẻo với nhau hơn là có một thứ nặng nề. Bởi vì bộ não sẽ dễ dàng xử lý một số điều đơn giản hơn là một điều quá phức tạp và khó hiểu.
- Viết bài kiểm tra đơn vị trở nên khó khăn hơn vì bài kiểm tra không biết biến toàn cục nào là cần thiết và chúng cần được khởi tạo như thế nào.
- Trong các ứng dụng đa luồng, việc sử dụng các biến toàn cục theo các luồng khác nhau sẽ dẫn đến sự gia tăng các lỗi khó gỡ lỗi và làm tăng độ phức tạp của dự án. Do đó, cần phải định cấu hình quyền truy cập vào các biến đó một cách chính xác hơn, trang bị cho chúng tính năng đồng bộ hóa và khóa. Điều này có thể dẫn đến đoản mạch trong tương lai. Ví dụ: luồng A đã khóa biến X cho công việc của nó và luồng B đã khóa biến Y cho công việc của nó và luồng A hiện cần biến Y và luồng B cần biến X. Kết quả là chương trình sẽ bị treo.
- Trong các dự án nhỏ, biến toàn cục là thứ đơn giản nhất để dự án hoạt động.
- Đôi khi nỗi sợ sử dụng các biến toàn cục thậm chí còn khiến dự án trở nên phức tạp hơn. Sau đó, các lập trình viên bắt đầu tạo các singleton và sử dụng các mẫu thiết kế khác.
- Trong lập trình, bạn thường cần dựa vào một số giá trị bất biến.
Điều hợp lý nhất là viết các giá trị đó dưới dạng hằng số, vì chỉ có hằng số mới đảm bảo rằng giá trị của một biến sẽ không thay đổi theo thời gian. Các hằng số như vậy có thể được tìm thấy mọi lúc (
Integer.MAX_VALUE
,Integer.MIN_VALUE
,Boolean.TRUE
,Collections.EMPTY_LIST
v.v.). Nhưng lập trình không giới hạn việc sử dụng các thư viện tiêu chuẩn. Điều thường xảy ra là bạn cần phải viết một loại logic duy nhất nào đó, logic này sẽ cần phải dựa vào các hằng số duy nhất của riêng bạn. Đó là lý do tại sao đôi khi việc sử dụng hằng số (biến toàn cục chỉ đọc) thực sự khiến cuộc sống trở nên dễ dàng hơn.
- Mọi thứ mà một nhà phát triển mới làm quen viết về cơ bản là một dự án nhỏ. Và việc sử dụng các biến toàn cục trong các dự án của anh ấy sẽ dạy anh ấy cách sử dụng các biến toàn cục ở mọi nơi.
- Tốt hơn hết là bạn nên học cách làm mà không cần “những thủ đoạn bị cấm”. Và với kinh nghiệm, sự hiểu biết về thời điểm thích hợp để sử dụng những kỹ thuật như vậy sẽ tự nó xuất hiện.
GO TO FULL VERSION