在Java中继承时管理参数

时间:2016-05-14 05:12:56

标签: java inheritance

目前我的Java程序中有两个类,它们共享大部分方法,并且都初始化了相当大的HashMap。因此,从单个父类中继承其中一个或两个都是有益的。但是,问题是其中一个类总是使用特定的值集填充HashMap,因此只有一个无参数构造函数,而另一个基于用户输入填充它,因此必须只有一个构造函数一个String参数(然后进行解析以获取进入HashMap的值;空String没有意义并抛出Exception

总之,我提出了三种可能的解决方案:

  1. 保留两个完全独立但高度冗余的课程。
  2. 使用无参数构造函数创建一个公共父类,除非从一个特定子项调用,否则将导致意外行为。
  3. 使用参数构造函数创建一个公共父类。然后,第一个类将其默认参数打包为String,然后将其解析以再次导出参数。这会严重影响性能。
  4. 是否有更好的解决方案,没有列出的缺点?

    修改

    解释具体细节有点困难,但总的来说我想模拟生化反应,我需要试剂(实际上是缓冲液中的混合物)和缓冲液(其中含有标准浓度的化学物质)的物体。有一个空的'是没有意义的。试剂或标准缓冲液作为试剂。然而,在这两种情况下,HashMap都保持了组分的浓度。

1 个答案:

答案 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 - 感性(形容词) - 与荒谬相反。