- vừa được xem lúc

Tìm hiểu tính đóng gói trong Java

0 0 5

Người đăng: Viblo Fundamentals

Theo Viblo Asia

Giới thiệu

Trong Java nói riêng và lập trình nói chung, tính đóng gói (encapsulation) là một nguyên lý quan trọng giúp bảo vệ và quản lý mã nguồn. Bằng cách ẩn thông tin và chỉ expose các thành phần cần thiết, tính đóng gói giúp tăng tính bảo mật, xây dựng mã nguồn dễ bảo trì và mở rộng trong các ứng dụng Java. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu lý thuyết, cách cài đặt và ứng dụng thực tế về tính đóng gói trong Java.

Tổng quan về tính đóng gói trong Java

Tính đóng gói trong là một trong 4 tính chất quan trọng của lập trình hướng đối tượng, đóng gói cho phép chúng ta ẩn thông tin và bảo vệ các thành phần của chương trình khỏi sự can thiệp từ bên ngoài. Điều này được thực hiện thông qua việc sử dụng các phạm vi truy cập như public, private và protected để kiểm soát quyền truy cập đến các thành phần của class.

Trong Java, tính đóng gói thường được thực hiện thông qua việc sử dụng các khái niệm như class, gói package, và từ khóa truy cập như private, protected, và public. Việc sử dụng các phạm vi truy cập này cho phép chúng ta xác định rõ ràng quyền truy cập đến các thành phần của class, giúp tạo ra một môi trường an toàn và có tổ chức trong quản lý mã nguồn.

Bằng cách sử dụng tính đóng gói, chúng ta có thể ẩn thông tin chi tiết bên trong một class và chỉ expose các phương thức hoặc thuộc tính cần thiết ra bên ngoài. Điều này không chỉ giúp tăng tính bảo mật cho mã nguồn mà còn giúp tạo ra các ứng dụng dễ bảo trì và mở rộng.

Tưởng tượng bạn đang viết một ứng dụng quản lý ngân hàng. Trong đó, bạn có một class là "Tài Khoản Ngân Hàng" (BankAccount). Bạn có thể sử dụng tính đóng gói để bảo vệ các thông tin như số tài khoản, số dư và các giao dịch.

public class BankAccount { private String accountNumber; // Số tài khoản private double balance; // Số dư // Các phương thức để thực hiện giao dịch và cập nhật số dư public void deposit(double amount) { // Thêm số tiền vào số dư balance += amount; // Các bước khác để cập nhật giao dịch, ví dụ như lưu vào lịch sử giao dịch } public void withdraw(double amount) { // Kiểm tra điều kiện trước khi rút tiền if (amount <= balance) { // Trừ số tiền khỏi số dư balance -= amount; // Các bước khác để cập nhật giao dịch và lịch sử rút tiền } else { System.out.println("Số dư không đủ để thực hiện giao dịch."); } } // Các phương thức getter để truy cập thông tin tài khoản một cách an toàn public String getAccountNumber() { return accountNumber; } public double getBalance() { return balance; }
}

Trong ví dụ này, các thông tin như số tài khoản và số dư được khai báo là private, chỉ có thể truy cập từ bên trong class "BankAccount". Điều này ngụ ý rằng bên ngoài, không ai có thể trực tiếp thay đổi hoặc truy cập các thông tin này. Thay vào đó, các phương thức public như depositwithdraw được cung cấp để thực hiện các giao dịch một cách an toàn và được kiểm soát.

Một số ví dụ

Ví dụ 1:

Để minh họa tính đóng gói trong một phần mềm quản lý nhân viên, chúng ta có thể tạo một class để biểu diễn thông tin về một nhân viên trong công ty.

public class Employee { private String name; // Tên nhân viên private int age; // Tuổi nhân viên private double salary; // Lương nhân viên private String department; // Bộ phận làm việc của nhân viên public Employee(String name, int age, double salary, String department) { this.name = name; this.age = age; this.salary = salary; this.department = department; } // Phương thức getter và setter để truy cập thông tin một cách an toàn public String getName() { return name; } public int getAge() { return age; } public double getSalary() { return salary; } public String getDepartment() { return department; } public void setSalary(double salary) { this.salary = salary; } // Phương thức để hiển thị thông tin của nhân viên public void displayInfo() { System.out.println("Tên: " + name); System.out.println("Tuổi: " + age); System.out.println("Lương: " + salary); System.out.println("Bộ phận làm việc: " + department); }
}

Trong ví dụ này, class Employee đóng gói thông tin về một nhân viên, bao gồm tên, tuổi, lương và bộ phận làm việc. Các thuộc tính này được khai báo là private để bảo vệ thông tin và chỉ có thể truy cập thông qua các phương thức getter và setter công khai.

Tính đóng gói cho phép chúng ta kiểm soát việc truy cập và cập nhật thông tin của nhân viên từ bên ngoài class Employee. Việc cung cấp các phương thức getter cho phép lấy thông tin một cách an toàn, trong khi việc sử dụng phương thức setter giúp cập nhật thông tin một cách kiểm soát.

Ngoài ra, có một phương thức displayInfo() để hiển thị thông tin của nhân viên. Điều này giúp tạo ra một cách tiếp cận giao diện công khai để hiển thị thông tin một cách trực quan và dễ đọc, trong khi vẫn bảo vệ thông tin cụ thể của nhân viên.

Ví dụ 2:

Hãy xem xét một ví dụ phức tạp hơn về tính đóng gói trong Java, liên quan đến một hệ thống quản lý trường học với các class như School, Teacher, StudentCourse.

import java.util.ArrayList;
import java.util.List; // Class mô phỏng thông tin về một giáo viên
class Teacher { private String name; private String subject; public Teacher(String name, String subject) { this.name = name; this.subject = subject; } public String getName() { return name; } public String getSubject() { return subject; }
} // Class mô phỏng thông tin về một học sinh
class Student { private String name; private int grade; public Student(String name, int grade) { this.name = name; this.grade = grade; } public String getName() { return name; } public int getGrade() { return grade; }
} // Class mô phỏng thông tin về một khóa học
class Course { private String courseName; private List<Student> studentsEnrolled; public Course(String courseName) { this.courseName = courseName; this.studentsEnrolled = new ArrayList<>(); } public void enrollStudent(Student student) { studentsEnrolled.add(student); } public void displayEnrolledStudents() { System.out.println("Danh sách học sinh đã đăng ký khóa học " + courseName + ":"); for (Student student : studentsEnrolled) { System.out.println("Tên: " + student.getName() + ", Điểm: " + student.getGrade()); } }
} // Class đại diện cho trường học, quản lý thông tin giáo viên và khóa học
class School { private List<Teacher> teachers; private List<Course> courses; public School() { this.teachers = new ArrayList<>(); this.courses = new ArrayList<>(); } public void addTeacher(Teacher teacher) { teachers.add(teacher); } public void addCourse(Course course) { courses.add(course); } public void displayTeachers() { System.out.println("Danh sách giáo viên trong trường:"); for (Teacher teacher : teachers) { System.out.println("Tên: " + teacher.getName() + ", Môn: " + teacher.getSubject()); } } public void displayCourses() { System.out.println("Danh sách các khóa học trong trường:"); for (Course course : courses) { System.out.println("Khóa học: " + course.courseName); course.displayEnrolledStudents(); } }
}

Trong ví dụ này, chúng ta có các class Teacher, Student, và Course để quản lý thông tin về giáo viên, học sinh và các khóa học. Class School đóng gói thông tin về giáo viên và các khóa học trong trường.

Mỗi class có các phương thức để truy xuất và quản lý thông tin, như displayEnrolledStudents() trong class Course để hiển thị danh sách học sinh đăng ký khóa học, hoặc displayTeachers() trong class School để hiển thị danh sách giáo viên trong trường.

Tính đóng gói ở đây giúp tổ chức chặt chẽ thông tin và chức năng của mỗi thành phần, tạo ra một cấu trúc mô-đun và dễ bảo trì trong hệ thống quản lý trường học.

Kết luận

Tính đóng gói trong Java là nền tảng quan trọng giúp tạo ra mã nguồn dễ bảo trì, bảo mật và linh hoạt. Áp dụng tính đóng gói thông minh giúp kiểm soát truy cập và tạo giao diện rõ ràng, đó là yếu tố cần thiết để xây dựng các ứng dụng Java chất lượng cao.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tổng hợp các bài hướng dẫn về Design Pattern - 23 mẫu cơ bản của GoF

Link bài viết gốc: https://gpcoder.com/4164-gioi-thieu-design-patterns/. Design Patterns là gì. Design Patterns không phải là ngôn ngữ cụ thể nào cả.

0 0 282

- vừa được xem lúc

Học Spring Boot bắt đầu từ đâu?

1. Giới thiệu Spring Boot. 1.1.

0 0 258

- vừa được xem lúc

Cần chuẩn bị gì để bắt đầu học Java

Cần chuẩn bị những gì để bắt đầu lập trình Java. 1.1. Cài JDK hay JRE.

0 0 37

- vừa được xem lúc

Sử dụng ModelMapper trong Spring Boot

Bài hôm nay sẽ là cách sử dụng thư viện ModelMapper để mapping qua lại giữa các object trong Spring nhé. Trang chủ của ModelMapper đây http://modelmapper.org/, đọc rất dễ hiểu dành cho các bạn muốn tìm hiểu sâu hơn. 1.

0 0 180

- vừa được xem lúc

[Java] 1 vài tip nhỏ khi sử dụng String hoặc Collection part 1

. Hello các bạn, hôm nay mình sẽ chia sẻ về mẹo check String null hay full space một cách tiện lợi. Mình sẽ sử dụng thư viện Lớp StringUtils download file jar để import vào thư viện tại (link).

0 0 55

- vừa được xem lúc

Deep Learning với Java - Tại sao không?

Muốn tìm hiểu về Machine Learning / Deep Learning nhưng với background là Java thì sẽ như thế nào và bắt đầu từ đâu? Để tìm được câu trả lời, hãy đọc bài viết này - có thể kỹ năng Java vốn có sẽ giúp bạn có những chuyến phiêu lưu thú vị. DJL là tên viết tắt của Deep Java Library - một thư viện mã ng

0 0 124