Trong bài viết này là demo nhỏ về việc áp dụng tính Đóng Gói (Encapsulation) trong Java. Bạn có thể áp dụng làm thử ví dụ của tôi để rút ra được bài học cũng như kinh nghiệm khi sử dụng tính đóng gói.

Demo này giải đáp cho câu hỏi của bạn conangngongcuong@gmail.com

Em chào a, Em đang có một thắc mắc hy vong a sẽ giải đáp giup e. Tính thừa kế trong java:theo e thấy thì hàm get/set nó được dùng như hàm nhập và xuất.Thế thì trong trường hợp nào thì mình dùng get/set,trường hợp nào thì mình dùng nhập/xuất và cách sử dụng của nó.Nếu a có tài liệu nào về get/set trong thừa kế thì cho e xin với. Hy vọng sẽ nhập được hồi âm sớm nhất của a Cảm ơn a nhiều
Để lấy ví dụ cho vấn đề này, chúng ta sẽ thử lập trình về đề tài "1 Garage đỗ xe ô tô".

Trước khi viết các đoạn mã xử lý để mô tả lại cách thức hoạt động của các đối tượng trong thế giới thực bằng Java code, chúng ta phải làm rõ các thông tin cũng như vai trò của từng đối tượng.

Với đề tài ta có:
+ Garage ô tô, bao gồm: tên garage, số lượng xe tối đa....
+ Ô tô, bao gồm: tên xe, chủ xe, biển số....

Với từng đối tượng, chúng ta phải thiết kế các thuộc tính và phương thức phù hợp ứng với vai trò và chức năng của nó. Garage ô tô có thể cho phép 1 ô tô đỗ trong bãi nhưng không có thể chạy hay tăng tốc chẳng hạn....Điều đó có nghĩa rằng, chúng ta phải thiết kế các phương thức độc lập và được đóng gói vào class phù hợp, class này sẽ có nhiệm vụ thực thi các chức năng đó.

Xây dựng các Object Models

Car Model:


/**
 *
 * @author code4lifevn
 */
public class Car {
    private String name;
    private String nameOfOwner;
    private String licenseNumberPlate;
    private boolean isParked;
    
    public Car() {
        isParked = false;
    }
    
    public void setParkedStatus(boolean isParked) {
        this.isParked = isParked;
    }
    
    public boolean isParked() {
        return this.isParked;
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLicenseNumberPlate() {
        return licenseNumberPlate;
    }

    public void setLicenseNumberPlate(String licenseNumberPlate) {
        this.licenseNumberPlate = licenseNumberPlate;
    }

    public String getNameOfOwner() {
        return nameOfOwner;
    }

    public void setNameOfOwner(String nameOfOwner) {
        this.nameOfOwner = nameOfOwner;
    }

    @Override
    public String toString() {
        StringBuilder carInfoBuilder = new StringBuilder();
        carInfoBuilder.append("Car Name: ").append(this.name).append("\n");
        carInfoBuilder.append("Name Of Owner: ").append(this.nameOfOwner).append("\n");
        carInfoBuilder.append("License Number Plate: ").append(this.licenseNumberPlate).append("\n");
        carInfoBuilder.append("Parked: ").append(this.isParked);
        return carInfoBuilder.toString();
    }
    
}


Garage Model:

import java.util.ArrayList;
import java.util.List;


/**
 *
 * @author code4lifevn
 */
public class Garage {

    private String name;
    private int amount;
    private List<Car> cars;

    public Garage(String name, int amount) {
        this.name = name;
        this.amount = amount;
        cars = new ArrayList<Car>(amount);
    }

    public void accept(Car car) {
        if (cars.size() >= amount) {
           System.out.println("Garage is full, can not accept " + car.getLicenseNumberPlate());
           return;
        }
        car.setParkedStatus(true);
        cars.add(car);
        System.out.println("Car: " + car.getLicenseNumberPlate() + " has been parked!");
    }
    
    public void reject(String licenseNumberPlate) {
        for (Car car : cars) {
           if(licenseNumberPlate.equalsIgnoreCase(car.getLicenseNumberPlate()) ) {
              cars.remove(car);
           }
        }
    }
    
    public void showAllCars() {
        for (Car car : cars) {
           System.out.println(car);
           System.out.println("=======");
        }
    }
    
    public List<Car> getAllCars() {
        return this.cars;
    }

    public int getAmount() {
        return amount;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}


Class Main:

/**
 *
 * @author code4lifevn
 */

public class Main {

    public static void main(String[] args) {
        Garage garage = new Garage("My Garage", 10);
        Car audi = new Car();
        audi.setName("Audi Q3");
        audi.setNameOfOwner("Do Manh");
        audi.setLicenseNumberPlate("15B1-14298");

        Car civic = new Car();
        civic.setName("Honda Civic 2013");
        civic.setNameOfOwner("Do Manh");
        civic.setLicenseNumberPlate("15B1-123456");

        Car bentley= new Car();
        bentley.setName("Bentley Flying Spur Mulliner 2013");
        bentley.setNameOfOwner("Do Manh");
        bentley.setLicenseNumberPlate("15B1-1234567");

        garage.accept(civic);
        garage.accept(bentley);
        garage.accept(audi);

        garage.showAllCars();

        garage.reject("15B1-123456");
        System.out.println("After Rejecting");
        System.out.println("====");
        garage.showAllCars();
    }
}


Ví dụ trên giúp bạn phần nào hiểu cách lập trình OOP qua những dòng code sử dụng tính bao đóng và chia tách chức năng theo từng đối tượng cụ thể.

Chúc bạn học tốt và nắm vững được kỹ thuật này!
Xem bài viết: Những khái niệm lập trình OOP cơ bản (P.1) - Tính Đóng Gói
 

code4lifevn team

Thanh niên nghiêm túc :)

Name: Manh Do

Age: 35 years old

Job: Senior Java and Mobile Developer

Country: VietNam

Name: Hung Nguyen

Age: 32 years old

Job: Android Developer

Country: VietNam

Name: Trung PH

Age: 37 years old

Job: Senior iOS and Android Developer

Country: VietNam

Name: Điệp NT

Age: 33 years old

Job: Senior .Net and Android Developer

Country: VietNam