首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最佳实践/设计模式,而不是构造函数重载java

最佳实践/设计模式,而不是构造函数重载java
EN

Stack Overflow用户
提问于 2021-03-19 17:24:20
回答 6查看 221关注 0票数 3

我有一个有多个构造函数的类。每一个都代表不同的用例。

代码语言:javascript
复制
public class ABC {
  public ABC(int x) {
  ...
  }
  public ABC(ArrayList<String> Stringarray) {
  ...
  }
  ..many more constructors..
}

到目前为止,构造函数重载一直是干净的解决方案,直到我在java编译器中遇到了同样的擦除问题。例如,我想添加另一个具有相同擦除的构造函数,所以我现在只选择包含一个默认参数来解决,如下所示:

代码语言:javascript
复制
public ABC(ArrayList<String> stringArray) {
  …
}
public ABC(ArrayList<Integer> integerArray, boolean… sameErasureFlag) {
  …
}

但我有一种强烈的感觉,对于这个用例来说,拥有如此多的构造函数可能不是一个好的设计模式。也许有更好的解决方案或最佳实践设计模式可用于此类场景。我正在查找构建器模式,但不确定它是否正确/更好。有什么建议吗?

EN

回答 6

Stack Overflow用户

发布于 2021-03-19 17:40:37

我有一个有多个构造函数的类。每一个都代表不同的用例。

那么简单的答案是:将每个用例转换为它自己的不同类。

在一个类中有多个不相关的字段,并且每个“用例”只使用其中的一些字段,这种想法是一个清晰的指示,表明您的类正在做太多的事情。

任何类或方法应该只做“一件事”。所以,正如所说的:答案就是停在这里,而不是将更多的内容添加到一个类中:问问自己如何才能有意义地拆分它。

票数 8
EN

Stack Overflow用户

发布于 2021-03-19 17:29:37

这取决于类对参数做了什么,我们没有确切的细节,但是对于泛型类型,你可以做的一件简单的事情就是让你自己的类成为泛型(在这种情况下可能不需要应用花哨的设计模式):

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2021-03-19 18:10:08

您的类是否真的实现了不同的用例,每个用例都由另一个构造函数表示?然后是this is the answer

如果您只想为执行相同操作的类提供不同的初始化路径,而不管用于初始化的数据的格式如何,那么使用多个构造函数可能是合适的。

但是当超过一定数量的构造函数时(一些人说是3个,其他人说是5个…一些极端分子甚至说1),你肯定有太多的工厂模式,然后你应该考虑工厂模式,就像here建议的那样。当你考虑引入“虚拟”参数来解决擦除问题时,无论你有多少个构造函数,这都应该被考虑到。工厂模式的优点在于,工厂方法的签名不仅仅由参数列表决定,您还可以选择不同的名称(ABC.ofIntList()ABC.ofStringList()等…)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66705534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档