Có một chuỗi các hoạt động "instanceof" được coi là một "mùi mã". Câu trả lời tiêu chuẩn là "sử dụng tính đa hình". Tôi sẽ làm như thế nào trong trường hợp này?
Có một số lớp con của một lớp cơ sở; không ai trong số họ nằm trong tầm kiểm soát của tôi. Một tình huống tương tự sẽ xảy ra với các lớp Java Integer, Double, BigDecimal, v.v.
if (obj instanceof Integer) {NumberStuff.handle((Integer)obj);}
else if (obj instanceof BigDecimal) {BigDecimalStuff.handle((BigDecimal)obj);}
else if (obj instanceof Double) {DoubleStuff.handle((Double)obj);}
Tôi có quyền kiểm soát NumberStuff, v.v.
Tôi không muốn sử dụng nhiều dòng mã trong đó một vài dòng sẽ làm được. (Đôi khi tôi tạo một HashMap ánh xạ Integer.class đến một phiên bản của IntegerStuff, BigDecimal.class đến một phiên bản BigDecimalStuff, v.v. Nhưng hôm nay tôi muốn một cái gì đó đơn giản hơn.)
Tôi muốn một cái gì đó đơn giản như sau:
public static handle(Integer num) { ... }
public static handle(BigDecimal num) { ... }
Nhưng Java không hoạt động theo cách đó.
Tôi muốn sử dụng các phương thức tĩnh khi định dạng. Những thứ tôi đang định dạng là hỗn hợp, trong đó Thing1 có thể chứa một mảng Thing2 và một Thing2 có thể chứa một mảng Thing1. Tôi đã gặp sự cố khi triển khai các bộ định dạng của mình như sau:
class Thing1Formatter {
private static Thing2Formatter thing2Formatter = new Thing2Formatter();
public format(Thing thing) {
thing2Formatter.format(thing.innerThing2);
}
}
class Thing2Formatter {
private static Thing1Formatter thing1Formatter = new Thing1Formatter();
public format(Thing2 thing) {
thing1Formatter.format(thing.innerThing1);
}
}
Vâng, tôi biết HashMap và một đoạn mã khác cũng có thể khắc phục điều đó. Nhưng "instanceof" dường như rất dễ đọc và có thể bảo trì bằng cách so sánh. Có món gì đơn giản mà không nặng mùi?
Ghi chú thêm vào 5/10/2010:
Hóa ra là các lớp con mới có thể sẽ được thêm vào trong tương lai và mã hiện tại của tôi sẽ phải xử lý chúng một cách khéo léo. HashMap trên Class sẽ không hoạt động trong trường hợp đó vì sẽ không tìm thấy Class. Một chuỗi câu lệnh if, bắt đầu bằng câu cụ thể nhất và kết thúc bằng câu chung chung nhất, có lẽ là tốt nhất sau tất cả:
if (obj instanceof SubClass1) {
// Handle all the methods and properties of SubClass1
} else if (obj instanceof SubClass2) {
// Handle all the methods and properties of SubClass2
} else if (obj instanceof Interface3) {
// Unknown class but it implements Interface3
// so handle those methods and properties
} else if (obj instanceof Interface4) {
// likewise. May want to also handle case of
// object that implements both interfaces.
} else {
// New (unknown) subclass; do what I can with the base class
}
[text](link)
để đăng liên kết trong bình luận.