我目前正在为供应链项目编写XML转换器。我们使用请求和订单。
转换器有多种方法,目前相同,但是分别为请求和订单实现。
因此,我创建了一个抽象类来提高代码的可维护性并使用泛型类型:
public abstract class AbstractConverter<T extends BusinessObject>
然后我有实际转换器的具体实现
public class OrderConverter extends AbstractConverter<Order>
public class RequestConverter extends AbstractConverter<Request>
正如我所说,我在两个特定的类中有几个基本相同的方法,所以我自然希望它们在抽象类中。我现在已经向抽象类添加了以下方法:
protected Comment createComment(T obj) {
String remark;
if (obj instanceof Order) {
remark = ((Order) obj).getRemark();
} else if (obj instanceof Request) {
remark = ((Request) obj).getRequestRemark();
} else {
throw new IllegalArgumentException("This method does not support objects of the type " + obj.getClass().toString());
}
return new Comment(remark);
}
我现在的问题是:这是要走的路还是在这种情况下有更优雅的方式来使用泛型?
我需要解决此问题,但我也希望使用好的风格。
答案 0 :(得分:3)
面向自然对象的解决方案是使createComment
成为一种抽象方法
protected abstract Comment createComment(T obj);
让子类实现它:
public class OrderConverter extends AbstractConverter<Order> {
protected Comment createComment(Order order) {
return new Comment(order.getRemark());
}
}
public class RequestConverter extends AbstractConverter<Request> {
protected Comment createComment(Request request) {
return new Comment(request.getRequestRemark());
}
}
答案 1 :(得分:2)
我建议将getRemark
方法解压缩到Request
和Order
都实现的接口。
这样您就可以简单地检查传入的通用对象是否是接口的实例。
protected Comment createComment(T obj) {
if (obj instanceof Remarkable) {
return new Comment(((Remarkable) obj).getRemark());
}
throw new IllegalArgumentException("This method does not support objects of the type " + obj.getClass().toString());
}