JavaRush /Blog Java /Random-VI /Biến toàn cục trong Java: Khi nào nên sử dụng chúng?
Анзор Кармов
Mức độ
Санкт-Петербург

Biến toàn cục trong Java: Khi nào nên sử dụng chúng?

Xuất bản trong nhóm
Xin chào! Trong bài viết này chúng ta sẽ nói về các biến toàn cục, cách khai báo của chúng và ví dụ về cách sử dụng phù hợp. Một lưu ý nhỏ: chúng tôi sẽ không xem xét các biến lớp toàn cục, nghĩa là những biến có thể được truy cập trong bất kỳ một lớp nào. Chúng ta sẽ nói về các biến toàn cục của toàn bộ ứng dụng - những biến có thể được truy cập trong toàn bộ ứng dụng. Biến toàn cục trong Java: Khi nào nên sử dụng chúng?  - 1

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 ab- 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.
Cái sau được gọi là hằng số toàn cầu. Để tạo một hằng số toàn cục, bạn cần tạo một biến finalvà 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: Biến toàn cục trong Java: Khi nào nên sử dụng chúng?  - 2Tuy 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. Biến toàn cục trong Java: Khi nào nên sử dụng chúng?  - 3Hã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 :
  1. Giảm khả năng đọc và tăng độ khó trong việc hiểu mã.
  2. Tăng độ phức tạp của việc bảo trì mã.
  3. Để 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.
  4. 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.

  5. 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.
  6. 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.
  7. 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.
  8. 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.
Nhưng tất cả đều không chính xác. Đây là mô tả về rủi ro, khả năng rủi ro này tăng lên cùng với sự phát triển của dự án và sự gia tăng số lượng các biến toàn cầu trong đó. Hãy chuyển sang ưu điểm :
  1. Trong các dự án nhỏ, biến toàn cục là thứ đơn giản nhất để dự án hoạt động.
  2. Đô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.
  3. 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_LISTv.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.

Nói chung, bạn không nên lạm dụng các biến toàn cục; nếu có thể, chỉ sử dụng các hằng số. Trước đó người ta đã nói rằng việc sử dụng các biến toàn cục trong các dự án nhỏ không phải là điều xấu. Nhưng tốt hơn hết là một nhà phát triển mới vào nghề không nên sử dụng chúng. Vì hai lý do:
  1. 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.
  2. 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.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION