Ôn tập: vùng chứa tổng quát
Thuộc phần Lập trình hướng đối tượng trong hành trình Java của Coddy. Bài học 58 trên 87.
Thử thách
DễHãy cùng xây dựng một hệ thống lưu trữ linh hoạt, kết hợp mọi điều bạn đã học về kiểu tổng quát! Bạn sẽ tạo một lớp Container có thể lưu trữ, truy xuất và xử lý các phần tử thuộc mọi kiểu dữ liệu, cùng với các phương thức tiện ích minh họa cách hoạt động của ký tự đại diện.
Bạn sẽ sắp xếp code trong ba tệp:
Container.java: Tạo một lớp tổng quátContainer<T>để quản lý một tập hợp các mục. Bên trong, bộ chứa của bạn cần dùngArrayList<T>để lưu trữ các phần tử. Thêm các phương thứcadd(T item)để thêm một phần tử,get(int index)để truy xuất phần tử ở một vị trí cụ thể,size()để trả về số lượng mục vàisEmpty()để kiểm tra xem bộ chứa có phần tử nào không. Đồng thời thêm phương thứcgetAll()để trả về danh sách bên trong.ContainerUtils.java: Tạo một lớp tiện ích có các phương thức tổng quát tĩnh hoạt động với bộ chứa của bạn:printAll(Container<?> container)- Dùng ký tự đại diện không giới hạn để in ra mọi phần tử trong bất kỳ bộ chứa nào, mỗi phần tử trên một dòng.countItems(Container<? extends Number> container)- Dùng ký tự đại diện có giới hạn trên để tính tổng mọi giá trị số trong bộ chứa, rồi trả về kết quả dưới dạngdouble.addDefaults(Container<? super Integer> container)- Dùng ký tự đại diện có giới hạn dưới để thêm các số nguyên 1, 2 và 3 vào bất kỳ bộ chứa nào có thể chứa số nguyên.<T> T getLastOrDefault(Container<T> container, T defaultValue)- Một phương thức tổng quát trả về phần tử cuối cùng trong bộ chứa, hoặc giá trị mặc định nếu bộ chứa rỗng.Main.java: Kết hợp hệ thống bộ chứa tổng quát của bạn! Bạn sẽ nhận ba đầu vào: một từ (String), một số nguyên và một số thực double.Trước tiên, tạo một
Container<String>và thêm từ đó vào hai lần. In raString container:, sau đó dùngprintAllđể hiển thị nội dung.Tiếp theo, tạo một
Container<Double>và thêm giá trị double vào đó. In ra một dòng trống, sau đó inNumber sum: [sum]bằngsumValues.Sau đó, tạo một
Container<Number>và gọiaddDefaultstrên bộ chứa đó. In ra một dòng trống, sau đó inAfter adding defaults:và dùngprintAllđể hiển thị nội dung.Cuối cùng, tạo một
Container<Integer>rỗng và dùnggetLastOrDefaultvới đầu vào số nguyên làm giá trị mặc định. In ra một dòng trống, sau đó inLast or default: [result].
Bạn sẽ nhận ba đầu vào theo thứ tự: một từ (String), một số nguyên và một số thực double.
Thử thách này kết hợp lớp tổng quát, phương thức tổng quát, tham số kiểu có giới hạn và cả ba kiểu ký tự đại diện. Hãy chú ý cách mỗi phần đảm nhiệm một mục đích khác nhau: lớp tổng quát cung cấp khả năng lưu trữ an toàn về kiểu dữ liệu, ký tự đại diện có giới hạn cho phép đọc và ghi linh hoạt, còn phương thức tổng quát cung cấp các thao tác có thể tái sử dụng trên nhiều kiểu bộ chứa!
Tự làm thử
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Đọc các giá trị đầu vào
String word = scanner.nextLine();
int intValue = Integer.parseInt(scanner.nextLine());
double doubleValue = Double.parseDouble(scanner.nextLine());
// TODO: Tạo một Container<String> và thêm word hai lần
// In ra "String container:", rồi dùng ContainerUtils.printAll()
// TODO: Tạo một Container<Double> và thêm giá trị double
// In ra một dòng trống, rồi dùng ContainerUtils.countItems() để in ra "Number sum: [sum]"
// TODO: Tạo một Container<Number> và gọi ContainerUtils.addDefaults() trên đó
// In ra một dòng trống, rồi in ra "After adding defaults:" và dùng ContainerUtils.printAll()
// TODO: Tạo một Container<Integer> rỗng
// Dùng ContainerUtils.getLastOrDefault() với intValue làm giá trị mặc định
// In ra một dòng trống, rồi in ra "Last or default: [result]"
}
}
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcTrường (thuộc tính)Phương thức khởi tạoNạp chồng phương thức khởi tạoÔn tập: Máy tính đơn giản4Kế thừa
Kế thừa cơ bản (extends)Từ khóa superGhi đè phương thức (@Override)Chuỗi gọi hàm khởi tạoLớp ObjectKế thừa đơn và đa cấpVì sao không hỗ trợ kế thừa nhiều lớpÔn tập: Phân cấp lớp Employee7Phương thức đặc biệt và lớp Object
Phương thức toString()equals() và hashCode()Phương thức clone()compareTo() và ComparableGiao diện ComparatorÔn tập: sắp xếp tùy chỉnh2Bộ điều chỉnh quyền truy cập và đóng gói
Tổng quan về các mức truy cậpPhương thức getter và setterẨn thông tinTừ khóa finalÔn tập: Trình quản lý tài khoản ngân hàng5Tính đa hình
Kiến thức cơ bản về nạp chồng phương thứcGhi đè phương thức (thời gian chạy)Chuyển kiểu lên và chuyển kiểu xuốngToán tử instanceofLớp và phương thức trừu tượngÔn tập: máy tính hình học8Khái niệm OOP nâng cao
Kết hợp và kế thừaKết tập và hợp thànhLớp bên trong, lớp lồng nhau và lớp ẩn danhKiểu enum và phương thức enumBản ghi (Java 16+)Lớp sealed (Java 17+)3Thuộc tính lớp và thành viên tĩnh
Biến của instance và biến tĩnhPhương thức tĩnhKhối tĩnhHằng số (static final)Ôn tập: bộ đếm và tiện ích6Giao diện và lớp trừu tượng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnPhương thức mặc định và tĩnh trong giao diệnLớp trừu tượng và giao diệnGiao diện hàmÔn tập: hệ thống thanh toán9Kiểu tổng quát
Giới thiệu về kiểu tổng quátLớp tổng quátPhương thức tổng quátTham số kiểu có giới hạnKý tự đại diện (?, extends, super)Ôn tập: vùng chứa tổng quát12Mẫu thiết kế, phần 2
Mẫu CommandMẫu AdapterMẫu DecoratorMẫu Template MethodMẫu StateMẫu CompositeMẫu IteratorTự luyện tập: Trình biên dịch Java online