我有一个有多个构造函数的类。每一个都代表不同的用例。
public class ABC {
public ABC(int x) {
...
}
public ABC(ArrayList<String> Stringarray) {
...
}
..many more constructors..
}到目前为止,构造函数重载一直是干净的解决方案,直到我在java编译器中遇到了同样的擦除问题。例如,我想添加另一个具有相同擦除的构造函数,所以我现在只选择包含一个默认参数来解决,如下所示:
public ABC(ArrayList<String> stringArray) {
…
}
public ABC(ArrayList<Integer> integerArray, boolean… sameErasureFlag) {
…
}但我有一种强烈的感觉,对于这个用例来说,拥有如此多的构造函数可能不是一个好的设计模式。也许有更好的解决方案或最佳实践设计模式可用于此类场景。我正在查找构建器模式,但不确定它是否正确/更好。有什么建议吗?
发布于 2021-03-19 17:40:37
我有一个有多个构造函数的类。每一个都代表不同的用例。
那么简单的答案是:将每个用例转换为它自己的不同类。
在一个类中有多个不相关的字段,并且每个“用例”只使用其中的一些字段,这种想法是一个清晰的指示,表明您的类正在做太多的事情。
任何类或方法应该只做“一件事”。所以,正如所说的:答案就是停在这里,而不是将更多的内容添加到一个类中:问问自己如何才能有意义地拆分它。
发布于 2021-03-19 17:29:37
这取决于类对参数做了什么,我们没有确切的细节,但是对于泛型类型,你可以做的一件简单的事情就是让你自己的类成为泛型(在这种情况下可能不需要应用花哨的设计模式):
public class ABC<T> {
public ABC(ArrayList<T> stringArray) {
…
}
…
}
ArrayList<Integer> intList = Stream.of(1, 2, 3)
.collect(Collectors.toCollection(ArrayList::new));
ArrayList<String> stringList = Stream.of("a", "b", "c")
.collect(Collectors.toCollection(ArrayList::new));
ABC<Integer> abc1 = new ABC<>(intList);
ABC<String> abc2 = new ABC<>(stringList);发布于 2021-03-19 18:10:08
您的类是否真的实现了不同的用例,每个用例都由另一个构造函数表示?然后是this is the answer!
如果您只想为执行相同操作的类提供不同的初始化路径,而不管用于初始化的数据的格式如何,那么使用多个构造函数可能是合适的。
但是当超过一定数量的构造函数时(一些人说是3个,其他人说是5个…一些极端分子甚至说1),你肯定有太多的工厂模式,然后你应该考虑工厂模式,就像here建议的那样。当你考虑引入“虚拟”参数来解决擦除问题时,无论你有多少个构造函数,这都应该被考虑到。工厂模式的优点在于,工厂方法的签名不仅仅由参数列表决定,您还可以选择不同的名称(ABC.ofIntList()、ABC.ofStringList()等…)。
https://stackoverflow.com/questions/66705534
复制相似问题