Dưới đây là một biến thể của một số các giải pháp đề xuất khác:
public abstract class CommandOverridingEquals implements Command {
public abstract boolean equals(Object other);
public abstract int hashcode();
}
Map<String, CommandOverridingEquals> map =
new HashMap<String, CommandOverridingEquals>();
Hoặc nếu bạn thực sự muốn để chắc chắn, sử dụng một hashmap kiểm tra; ví dụ.
Map<String, CommandOverridingEquals> map = Collections.checkedMap(
new HashMap<String, Command>(),
String.class, CommandOverridingEquals.class);
Nhưng không có vấn đề gì bạn làm bạn không thể ngăn người làm điều này:
public class AntiFascistCommand extends CommandOverridingEquals {
public boolean equals(Object other) { return super.equals(other); }
public int hashcode() { return super.hashcode(); }
...
}
tôi có xu hướng nghĩ rằng loại điều sẽ gây ra rắc rối xuống theo dõi. Ví dụ, giả sử rằng tôi có một loạt các lớp lệnh hiện có mở rộng một số lớp cơ sở khác, và (ngẫu nhiên) ghi đè equals
và hashcode
theo cách được quy định. Vấn đề là, tôi không thể sử dụng những lớp đó. Thay vào đó, tôi buộc phải reimplement chúng hoặc viết một bó wrappers.
IMO, bạn nên cố gắng buộc nhà phát triển đưa vào một mẫu triển khai cụ thể. Nó sẽ là tốt hơn để đưa một số cảnh báo mạnh mẽ vào Javadocs và dựa vào các nhà phát triển để làm điều đúng.
Nguồn
2009-10-23 10:08:28
Bạn có thể muốn thêm vào một 'hashCode' trừu tượng, chỉ để hoàn thành. – McDowell
Khá đúng ... chỉnh sửa cho phù hợp – skaffman
hoạt động như một nét duyên dáng, và quả thực, cộng với tôi đã có một lớp cơ sở trừu tượng .... vì vậy, nó không phải là một sự tái cấu trúc lớn. Cảm ơn –