Java改进特定类的Builder模式 [英] Java improving Builder pattern on a specific class
问题描述
目前我有这个实现Builder模式的类,为了便于阅读,我选择省略一些方法,更确切地说我只显示用户名的构建方法
。
currently I have got this class which implements the Builder pattern, for sake of readibility I have chosen to omit some methods, more precisely I only show the build methods of username
.
package dao.constraint;
import java.util.Arrays;
public class AccountConstraint {
private Constraint<Range<Integer>> accountIdConstraint;
private Constraint<String> usernameConstraint;
private Constraint<String> passwordConstraint;
private Constraint<String> emailConstraint;
private AccountConstraint(Builder builder) {
this.accountIdConstraint = builder.accountIdConstraint;
this.usernameConstraint = builder.usernameConstraint;
this.passwordConstraint = builder.passwordConstraint;
this.emailConstraint = builder.emailConstraint;
}
public Constraint<Range<Integer>> getAccountIdConstraint() {
return accountIdConstraint;
}
public Constraint<String> getUsernameConstraint() {
return usernameConstraint;
}
public Constraint<String> getPasswordConstraint() {
return passwordConstraint;
}
public Constraint<String> getEmailConstraint() {
return emailConstraint;
}
public Constraint[] getConstraints() {
return Arrays.asList(this.getAccountIdConstraint(), this.getUsernameConstraint(), this.getPasswordConstraint(), this.getEmailConstraint()).toArray(new Constraint[4]);
}
public static class Builder {
private Constraint<Range<Integer>> accountIdConstraint;
private Constraint<String> usernameConstraint;
private Constraint<String> passwordConstraint;
private Constraint<String> emailConstraint;
public Builder() {
this.accountIdConstraint = null;
this.usernameConstraint = null;
this.passwordConstraint = null;
this.emailConstraint = null;
}
public Builder username(final String username) {
this.usernameConstraint = new Constraint<>(Operation.IS, true, username, "username");
return this;
}
public Builder notUsername(final String username) {
this.usernameConstraint = new Constraint<>(Operation.IS, false, username, "username");
return this;
}
public Builder usernameLike(final String username) {
this.usernameConstraint = new Constraint<>(Operation.LIKE, true, username, "username");
return this;
}
public Builder usernameNotLike(final String username) {
this.usernameConstraint = new Constraint<>(Operation.LIKE, false, username, "username");
return this;
}
public AccountConstraint build() {
return new AccountConstraint(this);
}
}
}
正如你所看到的那样 AccountConstraint.Builder.username(String s)
和 AccountConstraint.Builder.notUsername(String s)
之间的细微差别。
As you can see there is very subtle difference between AccountConstraint.Builder.username(String s)
and AccountConstraint.Builder.notUsername(String s)
.
我希望能够写出类似的新AccountConstraint.Builder()。not(username(s));
。但是,如果在调用Java类中未定义 username(String s)
,我知道这不是有效的Java语法。我不想再次重复整个 AccountConstraint.Builder()
来到达用户名(String s)
部分。任何解决方案?
I would like to be able to write something like new AccountConstraint.Builder().not(username(s));
. However as I know this is not valid Java syntax if username(String s)
is not defined in the calling Java class. I neither wish to repeat the whole AccountConstraint.Builder()
again to reach the username(String s)
part. Any solutions?
第二个问题:可以 AccountConstraint.getConstraints()
改进或编写更简单吗?
Second question: Can AccountConstraint.getConstraints()
be improved or written more simple?
问候。
推荐答案
你可以而不是
构建器的一个方法,设置一个标志,然后否定下一个约束。
you could make not
a method of your builder, setting a flag, which then negates the next constraint.
private boolean negate = false;
public Builder not() {
negate = true;
}
public Builder username(final String username) {
this.usernameConstraint = new Constraint<>(Operation.IS, !negate, username, "username");
negate = false;
return this;
}
这篇关于Java改进特定类的Builder模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!