【问题标题】:How to link two objects of different classes?如何链接不同类的两个对象?
【发布时间】:2019-06-20 10:24:10
【问题描述】:

我想为一个库构建一个 REST API(端点是客户和发票)。其中一项功能是添加发票(带有客户 ID 的 PUT 请求)。首先,我必须检查传递的客户 ID(通过 URL 中的 PUT)是否存在,这意味着检查 customerMap 并查看正在讨论的 ID。问题是customerMap 是clientService 类中的HashMap(而不是invoiceService 类)(使用Map 而不是数据库)。如何访问存储在地图中的数据?特此相关部分代码:

客户

public class client {

private static final AtomicLong counter = new AtomicLong();

private final long id;

public client() {
    this.id = counter.getAndIncrement();
}

public long getId() {
    return id;
}
}

客户服务

public class clientService {
public Map<Long, client> clientMap = new HashMap<>();

public client put(client g) {
    clientMap.put(g.getId(), g);
    return g;
}

public Collection<client> getAll() {
    return clientMap.values();
}
}

发票

invoice  {

private static final AtomicLong counter = new AtomicLong();

private final long id;
private client client;

public invoice() {
    this.id = counter.getAndIncrement();
}

public long getId() {
    return id;
}
}

发票服务

public class invoiceService {
private Map<Long, invoice> invoiceMap = new HashMap<>();

public Rechnung createinvoice(invoice g, long id) {

    if(<!--client exists-->)
    invoicegMap.put(g.getId(), g);
    return g;
}}

【问题讨论】:

  • 链接这两个类可能会导致糟糕的设计。在创建新发票时,为什么不查询clientService 以检查客户端是否存在? clientService 负责获取有关客户的信息,而不是 invoiceService 的责任,因此在 invoiceService 类中实施此类检查并不可取。
  • 请始终以大写字符开头类名

标签: java spring rest api


【解决方案1】:

首先向您的 ClientService 添加一个方法以通过 id 查找客户端:

public Client getClientById(Long clientId) {
   return clientMap.get(clientId);
}

然后将您的 ClientService 注入到您的 Invoice Service 中;

public class invoiceService {
private Map<Long, invoice> invoiceMap = new HashMap<>();
private ClientService clientService; // provide a getter or a constructor argument for the service

public Rechnung createinvoice(invoice g, long id) {

    if(clientService.getClientById(id) != null) {
      invoicegMap.put(g.getId(), g);
}
    return g;
}}

【讨论】:

    【解决方案2】:

    为什么不将客户端映射设为静态并直接从客户端服务类访问它?

    【讨论】:

    • 你能给我更多的细节吗?客户端类中的createinvoice方法应该吗?没有其他可能吗?
    • 我相信在客户端类中有 createInvoice 会造成同样的问题,我不确定,但只是在 clientServiece 中将 clientmap 设为静态并直接访问它就可以解决问题,所以只需制作地图静态的,然后使用 invoiceServiece 类中的 clientServiece.clientMap 访问它
    猜你喜欢
    • 2019-11-05
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    相关资源
    最近更新 更多