Java 使用泛型类型的方法
我目前正在为一个供应链项目编写一个XML转换器。我们使用请求和命令 转换器有多个方法,当前执行相同的操作,但分别为请求和订单实现 因此,我创建了一个抽象类来提高代码的可维护性,并使用了泛型类型:Java 使用泛型类型的方法,java,generics,inheritance,Java,Generics,Inheritance,我目前正在为一个供应链项目编写一个XML转换器。我们使用请求和命令 转换器有多个方法,当前执行相同的操作,但分别为请求和订单实现 因此,我创建了一个抽象类来提高代码的可维护性,并使用了泛型类型: public abstract class AbstractConverter<T extends BusinessObject> 我现在的问题是:这是一种方法,还是有一种更优雅的方法在这种情况下使用泛型 我需要解决这个问题,但我也想使用好的风格 我建议将getRemark方法提取到一个接
public abstract class AbstractConverter<T extends BusinessObject>
我现在的问题是:这是一种方法,还是有一种更优雅的方法在这种情况下使用泛型
我需要解决这个问题,但我也想使用好的风格 我建议将
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());
}
我建议将
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());
}
自然的面向对象解决方案是使
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());
}
}
公共类OrderConverter扩展了AbstractConverter{
受保护的注释createComment(顺序){
返回新注释(order.getRemark());
}
}
公共类RequestConverter扩展了AbstractConverter{
受保护的注释createComment(请求){
返回新注释(request.getRequestRemark());
}
}
自然的面向对象解决方案是将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());
}
}
公共类OrderConverter扩展了AbstractConverter{
受保护的注释createComment(顺序){
返回新注释(order.getRemark());
}
}
公共类RequestConverter扩展了AbstractConverter{
受保护的注释createComment(请求){
返回新注释(request.getRequestRemark());
}
}
。。。如果可以让BusinessObject
同时实现卓越的接口,您甚至可以跳过实例的。@DaDaDom那么拥有接口是没有用的。如果所有BusinessObject
都可以返回备注,只需在该类中使用抽象方法即可。感谢您的输入。不幸的是,我不能这样做,因为我不能更改顺序和请求类,因为这将意味着对现有代码进行大量重构,因为我有几十个方法,目前已经实现了两次,如果代码基本上没有实现,我不认为有两个单独的实现有什么意义same@Fish-听起来像是糟糕的编码。你甚至承认想要更优雅的代码。我将提取所有“几乎”复制到接口中的方法,或者如果适用,直接提取到抽象类中。它极大地提高了对象的可读性和可用性。。。。如果可以让BusinessObject
同时实现卓越的接口,您甚至可以跳过实例的。@DaDaDom那么拥有接口是没有用的。如果所有BusinessObject
都可以返回备注,只需在该类中使用抽象方法即可。感谢您的输入。不幸的是,我不能这样做,因为我不能更改顺序和请求类,因为这将意味着对现有代码进行大量重构,因为我有几十个方法,目前已经实现了两次,如果代码基本上没有实现,我不认为有两个单独的实现有什么意义same@Fish-听起来像是糟糕的编码。你甚至承认想要更优雅的代码。我将提取所有“几乎”复制到接口中的方法,或者如果适用,直接提取到抽象类中。它极大地提高了对象的可读性和可用性。“基本上”是什么意思?没有“一点点怀孕”。它们是相同的,然后将它们拉入抽象类,或者它们不是,然后分别实现它们(参见wero的答案)。通过引入if/else/instanceof blocks来增加复杂性和不可维护性,这确实是个坏主意。“基本上”是什么意思?没有“一点点怀孕”。它们是相同的,然后将它们拉入抽象类,或者它们不是,然后分别实现它们(参见wero的答案)。通过引入if/else/instanceof块来增加复杂性和不可维护性,这确实是个坏主意。