```java public class Person { private String name; private int age; private String gender;
// constructor, getters and setters } ```
class Person {
private final String id; // government id
private String name;
private String status;
private Person(String id, String name) {
this.id = id;
this.name = name;
this.status = "NEW";
}
Person static createNew(String id, String name) {
return new Person(id, name);
}
void validate() {
//logic
this.status = "VALID";
}
public static final class Builder {
private String id;
private String name;
private String status;
private Builder() {
}
public static Builder aPerson() {
return new Builder();
}
public Builder id(String id) {
this.id = id;
return this;
}
public Builder name(String name) {
this.name = name;
return this;
}
public Builder status(String status) {
this.status = status;
return this;
}
public Person build() {
Person person = new Person(id, name);
person.status = this.status;
return person;
}
}
我将这个领域类对象存储在数据库中,它是一个普通的类,具有相同的字段+getter和setter。 当我想要存储对象时,我创建一个新的PersonDocument
(数据存储在mongo中),使用getter和setter并保存它。 当我想从DB中获取它时,变得复杂了。 我希望我的领域对象仅公开必要的内容,对于业务逻辑,目前只需要创建和验证。 简单地说:
Person p = Person.createNew("1234", "John");
p.validate();
repository.save(p);
另一种变得复杂的方式是,目前有一个生成器可以允许在任何状态下创建对象。我们确信在数据库中存储的数据具有适当的状态,因此可以以这种方式创建,但缺点是有一个公共API可用,让任何人都可以做任何事情。
最初的想法是使用MapStruct java映射库,但它使用setter来创建对象,并且暴露域类中的setter(据我所知)应该被避免。
有任何建议如何正确实现吗?