如何解决除了构造函数重载java之外的最佳实践/设计模式
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) {
…
}
但我有一种强烈的感觉,对于这个用例来说,可能有这么多构造函数并不是一个好的设计模式。也许有一个更好的解决方案或最佳实践设计模式用于这种场景。我正在查找构建器模式,但不确定这是否正确/更好。有什么推荐吗?
解决方法
我有一个具有多个构造函数的类。每个代表不同的用例。
那么简单的答案是:将每个用例转化为自己独特的类。
您在一个类中有多个不相关的字段,而每个“用例”只使用其中的一些的想法明确表明您的类正在执行太多事情。
任何类或方法都应该只做“一件事”。所以,正如所说:答案是停在那里,而不是在一个班级中添加更多东西:问问自己你如何才能有意义地将它拆开。
,这取决于类究竟用参数做什么,我们没有确切的细节,但是你可以为泛型类型做的一件简单的事情就是让你自己的类成为泛型(也许不需要应用在那种情况下花哨的设计模式):
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);
,
您的类是否真的实现了不同的用例,每个用例都由另一个构造函数表示?然后this is the answer!
如果你只是想为你的类提供不同的初始化路径,否则会做同样的事情,无论你用于初始化的数据格式如何,那么拥有多个构造函数可能是合适的东西。
但是当超过一定数量的构造函数时(有人说是3,有人说是5……有些极端分子甚至说是1),你的构造函数肯定太多了,那么你应该考虑工厂模式,建议here .当您考虑引入“虚拟”参数来解决擦除问题时,应该明确考虑这一点——无论您有多少个构造函数。工厂模式的优点是工厂方法的签名不仅仅由参数列表决定,你还可以选择不同的名称(ABC.ofIntList()
、ABC.ofStringList()
等等……)。
我有一种强烈的感觉,可能有这么多构造函数并不是一个好的设计模式..
这取决于。
有些人更喜欢构造函数,有些人更喜欢其他方法,但我认为你是对的,有很多重载的构造函数可能很难阅读和维护。
要考虑的一种替代方法是 Static Factory Methods
。最近,很多作者建议使用静态工厂方法而不是构造函数。
您可能想要偏爱它们的原因很少:
它们为您提供更好、更清晰、更直观的可读性
你不能给构造函数命名。构造函数名称始终与类名称相同;但是,您可能会发现使用命名很有用,因为它们会提供更清晰的可读性。
您可以构造和返回子类型
使用构造函数时,不能改变构造对象的类型;但是,工厂方法可以返回从超类派生的对象s,这意味着您可以根据输入条件决定确切地构造什么。
,如果您的班级中有太多字段,我建议您的设计很糟糕。有些人可能会建议使用 Builder Pattern。但是我觉得还是多尊重OOP比较好,所以我觉得把你的类分成多个类,使用装饰器模式比较好。
,是的,有很多构造函数可以指出类违反了单一职责原则。 我同意 - 没有足够的信息来做出决定。建造者模式甚至抽象工厂都可以工作。 但是 - 考虑按照 J.Bloch 的建议使用工厂方法而不是构造函数:
public ABC of(ArrayList<Integer> integerArray,boolean… sameErasureFlag) {
… }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。