Lập trình hướng đối tướng có nhiều concept, trong đó Đóng gói (Encapsulation) là một khái niệm cực kỳ quan trọng.
Hôm nay mình sẽ giới thiệu với bạn về Đóng gói trong lập trình Java hướng đối tượng bằng ví dụ cụ thể.
Ví dụ về Đóng gói (Encapsulation) trong Java OOP
Trong bài học này bạn sẽ được học:
-
Đóng gói trong Java là gì?
-
Ví dụ về Đóng gói trong Java
-
Ẩn dữ liệu trong Java
-
Các phương thức Getter và Setter trong Java
-
Trừu tượng so với Đóng gói
-
Ưu điểm của đóng gói trong Java
1. Đóng gói (Encapsulation) là gì trong Java?
Đóng gói là một nguyên tắc đóng gói dữ liệu (biến) và mã với nhau dưới dạng một đơn vị. Đây là một trong bốn khái niệm OOP. Ba cái còn lại là Kế thừa, Đa hình và Trừu tượng.
2. Ví dụ về Đóng gói trong Java qua cách Hack tài khoản Ngân hàng
Cách học nhanh nhất là học qua ví dụ thực tế. Và để hiểu chi tiết đóng gói là gì, mình sẽ thử hack tài khoản ngân hàng:
Trước tiên, tài khoản ngân hàng đơn giản được mô phỏng bằng class Account sau với phương thức tiền gửi và hiển thị số dư.
Giả sử mình định Hack tài khoản ngân hàng này, mình sẽ cố gắng để có quyền truy cập vào mã tài khoản ngân hàng.
Bây giờ, mình thử cố gắng trừ 100 đồng ở tài khoản này bằng hai cách. Hãy cùng xem cách làm này như thế nào nhé:
-
Cách tiếp cận 1: Mình cố gắng thực hiện một lệnh không hợp lệ (giả sử -100 đồng) vào tài khoản ngân hàng này bằng cách thao túng code như sau:
Bây giờ, câu hỏi là - Cách này có thể thành công không? Hãy thử kiểm tra xem:
Thông thường, một biến trong một lớp được đặt là 'private' như hình bên dưới. Nó chỉ có thể được truy cập với các phương thức được định nghĩa trong class đó. Không có class hoặc đối tượng nào khác có thể truy cập vào chúng.
Ví dụ về Encapsulation trong Java OOP: Chức năng của private
Nếu một data member là private, điều đó có nghĩa là nó chỉ có thể được truy cập trong cùng một class. Không có class bên ngoài có thể truy cập private data member hoặc biến của class khác.
Vì vậy, trong trường hợp giả định này, mình không thể trừ -100 đồng ở tài khoản của ngân hàng này.
-
Cách thứ 2: Cách tiếp cận đầu tiên của mình nhằm cố gắng trừ tiền nhưng không thể, thế nên tiếp theo, mình sẽ thử trừ 100 đồng bằng cách sử dụng phương thức 'deposit'.
Nhưng trong class Account ban đầu có kiểm tra các giá trị âm. Vì vậy, cách thứ hai cũng lại thất bại.
Ví dụ về Encapsulation trong Java OOP: Kiểm tra giá trị âm
Do đó, tài khoản ngân hàng này không bị lộ dữ liệu của nó ra bên ngoài. Chính vì thế, điều này làm cho tài khoản ngân hàng này trở nên an toàn.
Ví dụ về Encapsulation trong Java OOP: Ứng dụng an toàn nhờ Đóng gói
Toàn bộ mã có thể được coi là một viên nang (là kiểu dạng thuốc viên nang đó) và bạn chỉ có thể giao tiếp qua các tin nhắn. Chính vì thế nó có tên là Đóng gói (Encapsulation).
3. Ẩn dữ liệu trong Java
Thông thường, Java Encapsulation được gọi là ẩn dữ liệu (data hiding). Nhưng hơn cả việc ẩn dữ liệu, khái niệm Encapsulation có nghĩa là để quản lý tốt hơn hoặc nhóm các dữ liệu liên quan lại với nhau.
Để giảm mức độ đóng gói trong Java, bạn có thể sử dụng 'protected' hoặc 'public'.
Thêm nữa, với việc đóng gói, các lập trình viên Java có thể dễ dàng thay đổi một phần của mã mà không ảnh hưởng đến phần khác.
4. Phương thức Getter và Setter trong Java
Nếu một data member được khai báo là 'private', thì nó chỉ có thể được truy cập trong cùng một class. Không có class bên ngoài nào có thể truy cập data member của class đó.
Nếu bạn cần truy cập các biến này, bạn phải sử dụng các phương thức public 'getter' và 'setter'.
Các phương thức của Getter và Setter được sử dụng để tạo, sửa đổi, xóa và xem các giá trị biến.
Ví dụ về phương thức Getter và Setter trong lập trình Java:
Trong ví dụ trên:
-
Phương thức getBalance() là phương thức getter đọc giá trị của biến account_balance
-
Phương thức setNumber () là phương thức setter đặt hoặc cập nhật giá trị cho biến account_number
5. Trừu tượng so với đóng gói trong Java
Thông thường, Đóng gói hay bị hiểu nhầm với Trừu tượng.
-
Encapsulation nói về 'Làm thế nào' để làm được chức năng đó
-
Trừu tượng thì là 'Cái gì' mà một class có thể làm.
Một ví dụ đơn giản để hiểu sự khác biệt này là điện thoại di động.
Trong đó, logic phức tạp bên trong bảng mạch được gói gọn trong màn hình cảm ứng và giao diện được cung cấp để trừu tượng hóa nó ra cho người dùng.
6. Ưu điểm của Đóng gói trong Java
Đóng gói là một trong 4 khái niệm quan trọng trong lập trình hướng đối tượng Java. Nó được tạo ra là có mục đích, vì vậy nó có ưu điểm như là:
-
Đóng gói là ràng buộc dữ liệu với các chức năng liên quan của nó. Ở đây các chức năng có nghĩa là 'phương thức' và dữ liệu có nghĩa là 'biến'
-
Vì vậy, chúng ta giữ biến và phương thức ở một nơi. Nơi đó là 'class'. Class là cơ sở để đóng gói.
-
Với việc Đóng gói trong Java, bạn có thể ẩn (hạn chế quyền truy cập) dữ liệu quan trọng trong mã của mình, điều này giúp cải thiện khả năng bảo mật.
-
Như chúng ta đã nói ở trên, nếu một data member được khai báo là 'private' thì chỉ có thể truy cập trong cùng một class. Không có class bên ngoài có thể truy cập thành viên dữ liệu (biến) của lớp khác.
-
Tuy nhiên, nếu bạn cần truy cập các biến này, bạn phải sử dụng các phương thức public 'getter' và 'setter'.
Ok, như vậy là qua ví dụ Hack tài khoản ngân hàng về Đóng gói (Encapsulation) trong lập trình java hướng đối tượng bạn cũng đã hiểu sơ qua về Đóng gói. Như vậy là được rồi.
Chúng ta sẽ tiếp xúc và tìm hiểu kỹ hơn trong các bài học tiếp theo.
>>> Hoặc bạn có thể đăng ký tham gia ngay Lớp học lập trình Java để được hướng dẫn đầy đủ hơn về Encapsulation.