目前我的Java
程序中有两个类,它们共享大部分方法,并且都初始化了相当大的HashMap
。因此,从单个父类中继承其中一个或两个都是有益的。但是,问题是其中一个类总是使用特定的值集填充HashMap
,因此只有一个无参数构造函数,而另一个基于用户输入填充它,因此必须只有一个构造函数一个String
参数(然后进行解析以获取进入HashMap
的值;空String
没有意义并抛出Exception
。
总之,我提出了三种可能的解决方案:
String
,然后将其解析以再次导出参数。这会严重影响性能。是否有更好的解决方案,没有列出的缺点?
修改
解释具体细节有点困难,但总的来说我想模拟生化反应,我需要试剂(实际上是缓冲液中的混合物)和缓冲液(其中含有标准浓度的化学物质)的物体。有一个空的'是没有意义的。试剂或标准缓冲液作为试剂。然而,在这两种情况下,HashMap
都保持了组分的浓度。
答案 0 :(得分:1)
听起来选项3可能是您确定的三个中最好的。一种变体是让超类构造函数采用子类负责填充的HashMap参数。 (这避免了您担心的效率问题。)
例如
public abstract class C1 {
private Map<String, String> params;
public C1(Map<String, String> params) { this.params = params; }
}
public class C2 extends C1 {
public C2(String a, String b) {
super (new HashMap<String, String>() {{
put("a", a);
put("b", b);
}});
}
}
public class C3 extends C1 {
private HashMap<String, String> myMap = new HashMap<>();
public C3() {
super (myMap);
// now put values into myMap based on user input.
}
}
然而,正如他们所说,“魔鬼在细节中” 1 。在不了解问题细节的情况下,我们无法在您的问题背景下明智地讨论这些方法的专业人士和问题。
这说明如果原始类在设计时考虑了继承,那么继承重用最有效。至少您的上下文允许您考虑重大的重构。在很多情况下,您受到现有结构依赖程度的限制。 (特别是“客户”代码中的依赖关系。)
通过使超类抽象来解决你对传递空地图“没有意义”的担忧。由子类提供“sensical” 2 构造函数参数,具体取决于子类构造函数的使用方式。
1 - 例如,Elliott正在讨论的那类问题......
2 - 感性(形容词) - 与荒谬相反。