Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java对象构造函数和良好实践_Java_Jakarta Ee_Constructor - Fatal编程技术网

Java对象构造函数和良好实践

Java对象构造函数和良好实践,java,jakarta-ee,constructor,Java,Jakarta Ee,Constructor,我目前正在开发一个Java EE应用程序,因此我的应用程序服务器端有多个层(简而言之): 实体和道 BO和服务 DTO和控制器 我的问题是,由于我总是将实体转换为BO以防止DB覆盖并减少工作负载,因此在BO中包含一个以实体为参数的构造函数是否是一种良好的做法 请参见下面的我的代码: Livraison.java package my.tree.model; imports @Entity public class Livraison { @Id @GeneratedVa

我目前正在开发一个Java EE应用程序,因此我的应用程序服务器端有多个层(简而言之):

  • 实体和道
  • BO和服务
  • DTO和控制器
我的问题是,由于我总是将实体转换为BO以防止DB覆盖并减少工作负载,因此在BO中包含一个以实体为参数的构造函数是否是一种良好的做法

请参见下面的我的代码:

Livraison.java

package my.tree.model;

imports


@Entity
public class Livraison {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private LocalDate date;
    @ManyToOne
    @JoinColumn(name = "FournisseurId", nullable = false)
    private Fournisseur fournisseur;
    @ManyToOne
    @JoinColumn(name = "CategorieId", nullable = false)
    private Categorie categorie;
    private Integer netTotal;
    private String prefixCode;
    private Integer compte;
    @Transient
    private List<Palette> palettes = new ArrayList<>();

    public Livraison() {}

    public Integer getId() {
        return id;
    }
    
    //getters and setters
}
package my.tree.bo;

import Livraison;

public class LivraisonBo {
    private int id;
    private String date;
    private int fournisseurId;
    private int categorieId;
    private Integer netTotal;
    private String prefix;
    private Integer compte;


    public LivraisonBo() {
    }

    //classic constructor
    public LivraisonBo(int id, String date, int fournisseurId, int categorieId, Integer netTotal, String prefix, Integer compte) {
        this.id = id;
        this.date = date;
        this.fournisseurId = fournisseurId;
        this.categorieId = categorieId;
        this.netTotal = netTotal;
        this.prefix = prefix;
        this.compte = compte;
    }

    // constructor taking an entity as parameter
    public LivraisonBo(Livraison l) {
        this.id = l.getId();
        this.date = l.getDate().toString();
        this.fournisseurId = l.getFournisseur().getId();
        this.categorieId = l.getCategorie().getId();
        this.netTotal = l.getNetTotal();
        this.prefix = l.getPrefixCode();
        this.compte = l.getCompte();
    }
    
    //getters and setters
}

这是个好习惯吗?或者我应该把这个方法放在服务类中吗?
感谢您的帮助。

在我看来,创建转换器类将完成实体和BO之间的转换

如果您使用实体作为参数创建BO构造函数,那么您的BO将依赖于实体。这不是一个好的做法。因为这样一来,使用BO的人就需要有实体的定义

第一个选项带有多个参数也不是一个好的做法。将参数保持在5以下被视为良好做法


如果使用两个参数Entity和BO创建不同的转换器类,将使代码更清晰可读。此外,还将减少代码中不必要的依赖性。

代码审查有一个
StackExchange
方面,我想你应该在那里问这个问题。我会看看,谢谢。这是困扰我的问题,但我不知道是否应该换一种方式。谢谢你的见解!同意,并添加我的2c:有一些库可以使相似对象之间的转换非常容易-请参见例如Mapstruct,因此请使用转换器类;它们是自动实现的。此外,模型(或域)应该是实现的逻辑中心,而不是持久性逻辑。因此,我更喜欢用域名命名业务对象(例如这里的
Livraison
),并给JPA实体、DTO等赋予不同的名称(例如
LivraisonEntity
LivraisonDto
等)。@NikosParaskevopoulos是的,保留您建议的名称会更好。