Java 减少构造函数的数量
Java reduce number of constructors
假设我有一些 class 具有构造函数,每个构造函数都有 2 个参数
例如我有 5 种类型,其中两个可以作为第一个参数传递,三个作为第二个
假设类型是A,B,C,D,E。基本上我有这样的东西:
public SomeClass(A,C) {}
public SomeClass(A,D) {}
public SomeClass(A,E) {}
public SomeClass(B,C) {}
public SomeClass(B,D) {}
public SomeClass(B,E) {}
如您所见,这些类型有所有可能的组合
并且没有可选参数,就像在标准构建器模式中一样。
我可以做些什么来减少构造函数的数量?有什么模式可以帮助我吗?
编辑
我不能使用标准构建器,因为如果我提供了 A,那么我就不能提供 B
如果我提供了 C 那么我就不能提供 D 或 E
创建 2 个接口,一个用于第一个参数,一个用于第二个参数。 A 和 B 实现第一个,C、D 和 E 实现第二个。
您可以创建受限制的构建器模式:
class MyBuilder {
public MyBuilder(A) { ... }
public MyBuilder(B) { ... }
public SomeClass build(C) { ... }
public SomeClass build(D) { ... }
public SomeClass build(E) { ... }
}
用法示例:
new MyBuilder(A).build(C)
如果您只有 6 种可能的组合,我可能会容忍现有代码的复杂性和重复性。但是如果以后有更多的可能性and/or代码会被扩展,那么我会在这里推荐这种模式。
您可以将此模式扩展到更多参数,但它会变得更丑陋,因为您需要更多中间值 类。对于 3 个参数,您可以实现如下内容:
class MyBuilder1 {
public MyBuilder1(A) { ... }
public MyBuilder1(B) { ... }
public MyBuilder2 build(C) { ... }
public MyBuilder2 build(D) { ... }
public MyBuilder2 build(E) { ... }
class MyBuilder2 {
public MyBuilder2(C) { ... }
public MyBuilder2(D) { ... }
public MyBuilder2(E) { ... }
public SomeClass build(F) { ... }
public SomeClass build(G) { ... }
}
}
SomeClass x = new MyBuilder1(B).build(D).build(F);
不幸的是,中间阶段需要为类型 C、D、E 复制方法和构造函数。
一个建议。将逻辑放入您的构建器等价物 class。添加一个方法来检查参数组合是否有效。
class MyBuilder {
int paramA;
bool paramAset = false;
long paramB
bool paramBset = false;
// etc for all parameters.
void setParamA(int newAval) {
if (checkParamA(newAval)) {
paramA = newVal;
paramAset = true;
}
}
void setParamB(long newBval) {
if (checkParamB(newBval)) {
paramB = newBval;
paramBset = true;
}
}
// etc. for all parameters.
// Parameter checker method.
bool checkValid() {
if (
paramAset && !paramBset && /* other params */ ||
!paramAset && paramBset && /* other params */ ||
// other allowed parameter combinations
) {
return true;
} else {
return false;
}
}
} // end class MyBuilder
每个参数都有自己的值和一个布尔值来指示它是否被设置。检查器方法只允许布尔值的有效组合。请注意,每个参数都在检查器中指定为已设置或未设置,以捕获所有无效组合。主要 class 的构造函数需要调用检查器方法并在组合无效时适当地失败。
假设我有一些 class 具有构造函数,每个构造函数都有 2 个参数 例如我有 5 种类型,其中两个可以作为第一个参数传递,三个作为第二个
假设类型是A,B,C,D,E。基本上我有这样的东西:
public SomeClass(A,C) {}
public SomeClass(A,D) {}
public SomeClass(A,E) {}
public SomeClass(B,C) {}
public SomeClass(B,D) {}
public SomeClass(B,E) {}
如您所见,这些类型有所有可能的组合 并且没有可选参数,就像在标准构建器模式中一样。
我可以做些什么来减少构造函数的数量?有什么模式可以帮助我吗?
编辑
我不能使用标准构建器,因为如果我提供了 A,那么我就不能提供 B 如果我提供了 C 那么我就不能提供 D 或 E
创建 2 个接口,一个用于第一个参数,一个用于第二个参数。 A 和 B 实现第一个,C、D 和 E 实现第二个。
您可以创建受限制的构建器模式:
class MyBuilder {
public MyBuilder(A) { ... }
public MyBuilder(B) { ... }
public SomeClass build(C) { ... }
public SomeClass build(D) { ... }
public SomeClass build(E) { ... }
}
用法示例:
new MyBuilder(A).build(C)
如果您只有 6 种可能的组合,我可能会容忍现有代码的复杂性和重复性。但是如果以后有更多的可能性and/or代码会被扩展,那么我会在这里推荐这种模式。
您可以将此模式扩展到更多参数,但它会变得更丑陋,因为您需要更多中间值 类。对于 3 个参数,您可以实现如下内容:
class MyBuilder1 {
public MyBuilder1(A) { ... }
public MyBuilder1(B) { ... }
public MyBuilder2 build(C) { ... }
public MyBuilder2 build(D) { ... }
public MyBuilder2 build(E) { ... }
class MyBuilder2 {
public MyBuilder2(C) { ... }
public MyBuilder2(D) { ... }
public MyBuilder2(E) { ... }
public SomeClass build(F) { ... }
public SomeClass build(G) { ... }
}
}
SomeClass x = new MyBuilder1(B).build(D).build(F);
不幸的是,中间阶段需要为类型 C、D、E 复制方法和构造函数。
一个建议。将逻辑放入您的构建器等价物 class。添加一个方法来检查参数组合是否有效。
class MyBuilder {
int paramA;
bool paramAset = false;
long paramB
bool paramBset = false;
// etc for all parameters.
void setParamA(int newAval) {
if (checkParamA(newAval)) {
paramA = newVal;
paramAset = true;
}
}
void setParamB(long newBval) {
if (checkParamB(newBval)) {
paramB = newBval;
paramBset = true;
}
}
// etc. for all parameters.
// Parameter checker method.
bool checkValid() {
if (
paramAset && !paramBset && /* other params */ ||
!paramAset && paramBset && /* other params */ ||
// other allowed parameter combinations
) {
return true;
} else {
return false;
}
}
} // end class MyBuilder
每个参数都有自己的值和一个布尔值来指示它是否被设置。检查器方法只允许布尔值的有效组合。请注意,每个参数都在检查器中指定为已设置或未设置,以捕获所有无效组合。主要 class 的构造函数需要调用检查器方法并在组合无效时适当地失败。