Giải pháp chuyển đổi số trọn gói cho doanh nghiệp Việt
Có thể nói, cho đến bài học OOP hôm nay, đã có ngày càng nhiều từ khóa được lần lượt giới thiệu đến các bạn. Để mình giúp các bạn ôn lại một chút các từ khóa và tên gọi quan trọng mà chúng ta đã xem qua.
Vậy thì hôm nay, chúng ta lại tiếp tục tìm hiểu thêm một từ khóa mới, từ khóa static, xem từ khóa này là gì, và nó có công dụng gì nữa nhé.
Có thể nói, một trong những nghĩa tiếng Việt trong ngôn ngữ lập trình gây khó hiểu nhất là đây. Static – Dịch ra là tĩnh. Không hiểu gì cả.
Thực ra thì từ khóa static sẽ được áp dụng khi bạn khai báo các thành phần của lớp như bên dưới mình sẽ trình bày rõ. Nó mang tác dụng chính đối với sự quản lý về mặt bộ nhớ. Cụ thể là, các thành phần static sẽ thuộc về quản lý bộ nhớ của lớp, chứ không thuộc về quản lý của thể hiện lớp (hay có thể hiểu là đối tượng).
Vẫn chưa hiểu!.
Mình mời bạn nhìn vào ví dụ sau, có thể qua ví dụ bạn vẫn chưa nắm rõ công dụng mà từ khóa static mang lại, nhưng hãy xem nó tác động như thế nào đến việc quản lý các thành phần bên trong lớp mà mình có nói trên đây. Bạn hãy chú ý các thành phần static và không static trong lớp ToaDo.
Vậy như mình có nói. Thuộc tính thongTin là static, và nó sẽ thuộc quyền quản lý của lớp ToaDo. Các thuộc tính x, y là không static, sẽ thuộc quyền quản lý của các thể hiện, hay các đối tượng được khai báo từ ToaDo.
Vấn đề sẽ rõ ràng hơn khi bạn dùng đến các thành phần static này của ToaDo ở một lớp khác.
Bạn có thấy rằng, các thuộc tính x, y, cũng như bao thành phần không static khác mà bạn từng biết, đều phải được gọi thông qua một thể hiện của lớp, như toaDo1, toaDo2 ở ví dụ. Còn thuộc tính thongTin lại được truy cập trực tiếp thông qua lớp ToaDo, mà không cần bất cứ một thể hiện nào cả.
Đến đây thì bạn đã hiểu được thành phần static là gì đúng không nào. Chắc bạn cũng “hườm hườm” ngẫm được tại sao nó lại có nghĩa là tĩnh.
Tiếp theo chúng ta cùng tìm hiểu, từ khóa static sinh ra để làm gì.
Như một số thông tin mà mình đã trình bày trên đây, bạn có thể thấy rằng, với việc gọi đến thành phần của lớp thông qua tên lớp, mà không cần phải khởi tạo đối tượng của lớp đó, giúp cho các thành phần được khai báo static sẽ dễ dàng truy xuất hơn.
Đặc biệt hơn cả là, các thành phần được khai báo static này có thể được dùng chung bởi các lớp khác trong ứng dụng. Nó mang ý nghĩa toàn cục trong cả ứng dụng. Bạn cứ thử nhìn vào ví dụ trên, bạn đã thử gán giá trị cho static thongTin trong ToaDo bằng dòng lệnh
, thì ở một chỗ khác, trong lớp khác chẳng hạn, bạn có thể lấy giá trị ToaDo.thongTin này ra dùng, hoặc gán lại cho nó một giá trị mới. Như vậy thành phần static sẽ được chia sẻ, được dùng chung, bởi bất kỳ chỗ nào, trong lớp đó hoặc bên ngoài lớp (miễn là thành phần đó đừng khai báo là private).
Nhưng việc các thành phần của lớp được truy cập và sửa đổi thoải mái như thế này lại là con dao hai lưỡi. Nếu bạn lạm dụng từ khóa static, bạn sẽ vô tình làm phá vỡ nguyên tắc của OOP. Vốn dĩ OOP ra đời là để phân chia đặc điểm và trách nhiệm cho từng đối tượng, để dễ quản lý. Thì từ khóa static lại mang các tính chất vốn dĩ thuộc trách nhiệm của đối tượng nào đó, ra dùng chung một cách đại trà. Do đó, mình khuyên là bạn nên thật cân nhắc khi khai báo static cho bất cứ thành phần nào của lớp.
Vậy từ khóa static thực chất được dùng ở đâu? Mình mời các bạn đọc qua phần dưới đây. Ở từng công dụng cụ thể của từ khóa static, mình sẽ tìm những ví dụ thực tế nhất mà từ khóa static mang lại trong quá trình xây dựng ứng dụng.
Có lẽ không cần phải nói nhiều nữa. Thuộc tính static là thuộc tính có khai báo từ khóa static. Chúng được sử dụng như thế nào thì chúng ta cùng xem qua các ví dụ dưới đây, bạn sẽ hiểu rõ thôi.
Chúng ta cùng quay lại ví dụ về các thể loại hình học. Ví dụ như chúng ta có HinhHoc là lớp cha của hai lớp HinhTron và HinhChuNhat. Và yêu cầu của bài thực hành hôm nay là, mỗi khi chúng ta tạo ra một đối tượng hình học, thì có một biến đếm tự động tăng lên cho biết số lượng hình được tạo ra trong một chương trình.
Nào cùng xem qua lớp HinhHoc, giả sử chúng ta không quan tâm đến các dòng code tính toán khác, chỉ chú tâm vào biếm dem được set static bên trong lớp này.
Sau đó, cứ mỗi constructor của lớp con, chúng ta đều gọi đến lớp cha gần nhất của nó thông qua phương thức super(). Việc gọi này sẽ làm tăng biến dem này lên ở constructor của lớp cha.
Và rồi ở hàm main(), bạn hãy thử khai báo các đối tượng của HinhTron và HinhChuNhat thoải mái, rồi hãy in biến dem ra console xem sao nhé.
Kết quả in ra
Có khi nào bạn từng thắc mắc rằng, sẽ làm sao nếu như mong muốn ứng dụng có các giá trị cố định dùng chung, nó mang ý nghĩa là các giá trị cấu hình cho ứng dụng. Chẳng hạn như khai báo đường dẫn tĩnh để lưu file này, hay khai báo đường dẫn đến một trang web này, hay đường dẫn API này,…. Thì tất cả các nhu cầu về cấu hình tĩnh đó, bạn có thể gom chung chúng vào một file và khai báo các thuộc tính static kết hợp với final cho nó.
Tiếp tục với ví dụ về việc đếm các hình học trên đây. Giả sử yêu cầu của bài toán lúc này đặt ra là bạn không được khai báo quá 5 hình. Nếu ứng dụng có quá 5 hình, thay vì câu lệnh in ra số lượng hình học ở trên đây, bạn có thể in ra câu thông báo nào đó. Trong trường hợp này, số lượng tối đa 5 hình trong ràng buộc được xem như là một cấu hình tĩnh của ứng dụng.
Đầu tiên, chúng ta sẽ cần phải tạo một lớp chỉ chuyên cho việc cấu hình thôi. Mình đặt tên lớp này là Configs.
Quay lại main(), bạn hãy thử khai báo nhiều nhiều các đối tượng hình học xem nào. Sau đây là các kiểm tra ràng buộc dựa trên các giá trị cấu hình tĩnh lấy từ lớp Configs.
Giờ thì bạn có thể chạy thử ứng dụng lên kiểm chứng nhé.
Phương thức static được sử dụng với đặc điểm và mục đích tương tự như thuộc tính static trên kia. Đó là.
Tuy nhiên có một lưu ý hết sức đặc biệt trong Java là, tất cả các phương thức static chỉ có thể gọi đến các thuộc tính được khai báo là static mà thôi. Điều này được dễ dàng kiểm chứng khi rất lâu rồi, ở bài 8, mình buộc phải khai báo biến static name khi biến này để ở ngoài main(), và vì main() được khai báo là static (bạn đã biết là main() bắt buộc phải khai báo là phương thức static mà đúng không, nguyên nhân là để hệ thống có thể truy xuất bất cứ lúc nào thông qua lớp, chứ không cần khai báo thể hiện của lớp nào đó), nên nếu main() muốn dùng đến name, thì name cũng phải static.
Với bài thực hành này, giả sử ứng dụng hình học của chúng ta đòi hỏi khắt khe hơn về mặt nhập liệu và tính toán dựa trên các đơn vị. Và giả sử chúng ta chấp nhận hai đơn vị nhập vào là inch và centimet.
Trước mắt, lớp Configs sẽ phải xây dựng thêm một số giá trị cấu hình tĩnh, và phải thêm các phương thức tĩnh chuyển đổi đơn vị nữa.
Sau đó, ở lớp hình học nào cũng vậy, ví dụ dưới đây mình xây dựng cho lớp HinhTron, lớp này sẽ hỏi người dùng đang dùng đơn vị hình học nào, và sẽ xuất thông tin tương ứng kèm với thông tin chuyển đổi sang đơn vị còn lại dựa vào các cấu hình tĩnh và các phương thức tĩnh trong lớp Configs.
Phương thức main() được xây dựng đơn giản như sau.
Bạn tự chạy và kiểm chứng kết quả của chương trình nhé.
Vậy là chúng ta vừa đi qua khái niệm và cách sử dụng từ khóa static trong Java. Bạn có thể thấy rằng các thành phần static thực sự rất dễ dùng đúng không nào. Và lời khuyên của mình vẫn luôn là, bạn hãy cân nhắc, đừng lạm dụng từ khóa static này quá. Nếu không vì mục đích dùng chung như các ví dụ trên đây của mình, thì bạn đừng nên sử dụng đến từ khóa static nhé.
Chưa có câu hỏi nào cho bài này.