假设我的班级中有两个构造函数:
public User (List<Source1> source){
...
}
public User (List<Source2> source) {
...
}
假设这两个构造函数都提供了关于用户的相同信息,并且是为不同用例构造用户的同样有效的方法。
在 Java 中,由于类型擦除,您不能这样做——Java 不会接受两个以 List< 为参数的构造函数?>。
那么,解决这个问题的方法是什么?什么是不矫枉过正但仍尊重基本 OO 的解决方案?仅仅因为 Java 没有强大的泛型支持就必须围绕这个构造工厂方法或其他接口似乎是错误的。
以下是我能想到的可能性:
1)接受 aList<?>
作为构造函数的参数并在构造函数中解析您需要哪种逻辑,或者如果它不是任何可接受的类型,则抛出异常。
2) 创建一个接受任一 List 的类,构造适当的 User 对象并返回它。
3)创建包装器List<Source1>
,List<Source2>
可以将其传递给 User 构造函数。
4)用两个类子类这个家伙,除了构造函数之外,所有的功能都被继承了。一个的构造函数接受 Source1,另一个接受 Source2。
5)用构建器包装这个人,其中有两种不同的构建器方法,用于实例化的两个不同数据源。
我的问题是:
1)需要这样做是Java的缺陷,还是有意的设计决定?直觉是什么?
2) 在不引入不必要的复杂性的情况下,哪种解决方案在维护良好代码方面最强大?为什么?
这个问题是类似的:Designing constructors around type erasure in Java但没有详细说明,它只是提出了各种解决方法。