目的
对于一个参数,Java语言的语法不允许你使用预定义的值来声明一个方法。
在Java中,实现默认方法参数的最佳选择可能是使用方法重载。
方法重载允许您声明多个名称相同的方法,但他们的参数数量不同。
但是当一个方法需要接受多个参数时,将方法重载作为默认参数值的解决方案的主要问题是:为每个可能的组合创建重载方法参数可能很麻烦。
为了解决这个问题,可以使用了参数对象模式。
解释
参数对象只是方法所有参数的包装对象,它只不过是一个普通的POJO。
参数对象相对于常规的参数列表拥有这样的优势:类字段可以有默认值。
为方法的参数列表创建包装类后,将创建一个相应的生成器类,通常它是一个内部静态类。
最后一步是使用生成器构造一个新的参数对象。
对于跳过的参数,将使用它们的默认值。
程序示例
这是一个简单的“SearchService”类,其中方法重载用于默认值。要使用方法重载,参数的数量或参数类型必须不同。
java
public class SearchService {
//Method Overloading example. SortOrder is defaulted in this method
public String search(String type, String sortBy) {
return getQuerySummary(type, sortBy, SortOrder.DESC);
}
/* Method Overloading example. SortBy is defaulted in this method. Note that the type has to be
different here to overload the method */
public String search(String type, SortOrder sortOrder) {
return getQuerySummary(type, "price", sortOrder);
}
private String getQuerySummary(String type, String sortBy, SortOrder sortOrder) {
return "Requesting shoes of type \"" + type + "\" sorted by \"" + sortBy + "\" in \""
+ sortOrder.getValue() + "ending\" order...";
}
}接下来,将展示使用生成器模式创建的带有“参数对象”的“SearchService”。
java
public class SearchService {
/* Parameter Object example. Default values are abstracted into the Parameter Object
at the time of Object creation */
public String search(ParameterObject parameterObject) {
return getQuerySummary(parameterObject.getType(), parameterObject.getSortBy(),
parameterObject.getSortOrder());
}
private String getQuerySummary(String type, String sortBy, SortOrder sortOrder) {
return "Requesting shoes of type \"" + type + "\" sorted by \"" + sortBy + "\" in \""
+ sortOrder.getValue() + "ending\" order...";
}
}
public class ParameterObject {
public static final String DEFAULT_SORT_BY = "price";
public static final SortOrder DEFAULT_SORT_ORDER = SortOrder.ASC;
private String type;
private String sortBy = DEFAULT_SORT_BY;
private SortOrder sortOrder = DEFAULT_SORT_ORDER;
private ParameterObject(Builder builder) {
type = builder.type;
sortBy = builder.sortBy != null && !builder.sortBy.isBlank() ? builder.sortBy : sortBy;
sortOrder = builder.sortOrder != null ? builder.sortOrder : sortOrder;
}
public static Builder newBuilder() {
return new Builder();
}
//Getters and Setters...
public static final class Builder {
private String type;
private String sortBy;
private SortOrder sortOrder;
private Builder() {
}
public Builder withType(String type) {
this.type = type;
return this;
}
public Builder sortBy(String sortBy) {
this.sortBy = sortBy;
return this;
}
public Builder sortOrder(SortOrder sortOrder) {
this.sortOrder = sortOrder;
return this;
}
public ParameterObject build() {
return new ParameterObject(this);
}
}
}类图

适用
这个模式向我们展示了在Java中为方法设置默认参数的方法————当它没有现成的默认参数功能的时候。