首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理模块化应用程序中的泛型类/接口?

如何处理模块化应用程序中的泛型类/接口?
EN

Stack Overflow用户
提问于 2015-04-24 10:51:57
回答 2查看 100关注 0票数 4

我对Java很陌生,我正在编写一个模块化的应用程序,如下所示:

代码语言:javascript
运行
复制
*************          *******         ***********
*           *          *     *         *   Data  *
* Front-end * -------- * API * ------- * Handler *
*           *          *     *         *         *
*************          *******         ***********

本质上,我希望能够用N个类定义一个API,然后有一个“数据处理程序”模块来处理在某个地方存储对象(例如数据库),而前端不需要知道如何实现它。

因此,假设我在API中定义了两个类:。我希望前端能做到这样的事情:

代码语言:javascript
运行
复制
myContract = new Contract();
myCompany = new Company();
myContract.setCompany(myCompany);
myContract.save();
myCompany.save();

这样,将来我可以改变我存储数据的方式(数据处理模块),而不会改变前端的任何代码。

为此,我在API模块中为编写了两个接口。然后,在数据处理模块中,我编写了实现两个接口: DbContract和DbCompany的类。

现在,我遇到了一些问题,因为我已经将契约接口中的getter/setter方法定义为:

代码语言:javascript
运行
复制
public interface Contract {
    public Company getCompany();
    public void setCompany(Company company);
}

并在DbContract中将它们实现为:

代码语言:javascript
运行
复制
public class DbContract implements Contract {
    private DbCompany company;

    @Override
    public Company getCompany() {
        return this.company;
    }

    @Override
    public void setCompany(Company company) {
        this.company = company;
    }
}

但是,我得到了所有的类类型错配错误.我是不是完全搞错了重点?我该怎么做呢?

提前谢谢你的帮助。

EN

Stack Overflow用户

回答已采纳

发布于 2015-04-24 11:07:03

代码语言:javascript
运行
复制
myContract = new Contract();

这是行不通的,因为您不能创建接口的实例。

你似乎有正确的想法,但对“实现”一词似乎也存在误解。

如果前端需要创建这些接口的实例,则需要知道实现或提供自己的实现。另一方面,如果前端根本不知道实现,它应该调用后端来创建一个新实例。

此外,制作ContractCompany数据容器并将保存的实际逻辑移动到服务中可能是一个更好的设计,例如,您的代码如下所示:

代码语言:javascript
运行
复制
class Contract { ... } //as before, but classes not interfaces
class Company { ... } //as before, but classes not interfaces

创建新合同:

代码语言:javascript
运行
复制
Contract myContract = new Contract();
Company myCompany = new Company();
myContract.setCompany(myCompany);

contractService.save( myContract ); //assuming this would save the company as well

你可以查一下服务或者让它被注入。对于后者,请看一下Spring依赖项注入。

更新:

在您的评论中,您指出CompanyContract将是JPA实体,如果我对您的理解是正确的,您不希望前端有任何使用JPA的概念。

在这种情况下,您有两个选择:

  1. 将对象简化为POJO,并在后端为JPA映射添加XML。然后将从前端传递的每个实例作为一个独立的实体来处理。
  2. 如果您希望在映射中使用注释,并且不希望前端知道这一点,则需要提供一个由API使用的中间层(称为数据传输对象= DTO)。在内部,后端将在实体和DTO之间进行转换。
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29845594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档