【问题标题】:Is it better to use aggregation over inheritance when creating a generic CRUD component?在创建通用 CRUD 组件时使用聚合而不是继承会更好吗?
【发布时间】:2020-09-28 10:38:21
【问题描述】:

我有一个问题。我有这些课程:

public interface CRUDService<MODEL extends BaseModel<ID>,ID extends Serializable>
{
     List<MODEL> findAll();
     MODEL findById(ID id);
     // + delete, save & update methods
}

public abstract class AbstractCRUDService<MODEL extends BaseModel<ID>,ID extends Serializable> implements CRUDService<MODEL,ID>
{
     //overriding the CRUDService interface methods here.
}

像这样从AbstractCRUDService 扩展每个服务是否更好:

public class DefaultProductService extends AbstractCRUDService<ProductModel,Long> implements ProductService
{ //some methods here}

或者我应该从AbstractCRUDService 中删除abstract 并将此服务注入到DefaultProductService 中?

public class DefaultProductService implements ProductService {
    @Autowired
    private CRUDService<ProductModel,Long> crudService;

    // override "ProductService" methods here.
}

【问题讨论】:

    标签: java inheritance aggregation


    【解决方案1】:

    这取决于您的要求。

    如果所有 Model Types 都需要相同的 CRUD 实现,您可以使用第二种方法:组合。

    但是,如果不同的模型对象需要不同的 CRUD 实现,那么继承会更合适。例如,对于所有ProductModels Del(obj) 将从数据库表中删除对象,但是对于所有OrderModels Del(obj) 不会删除数据,而是执行其他操作,抛出异常,例如。

    【讨论】:

    • 哦,所以当我需要 delete 方法的另一个实现时,我只需在主类中重写它以防继承。
    【解决方案2】:

    是的,是的。你需要更喜欢组合而不是继承

    这里有一篇非常好的文章来阅读它

    composition over inheritance

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2012-07-01
      相关资源
      最近更新 更多