java - 在 Java 中管理继承时的参数

标签 java inheritance

目前,我的 Java 程序中有两个类,它们共享大部分方法,并且都初始化相当大的 HashMap。因此,从单个父类继承其中一个或从另一个父类继承其中两个将是有益的。然而,问题在于,其中一个类总是用一组特定的值填充HashMap,因此只有一个无参数构造函数,而另一个类则根据用户输入填充它,因此必须只有一个带有 String 参数的构造函数(然后解析该参数以导出进入 HashMap 的值;空的 String 没有任何意义并抛出异常一个异常)。

综上所述,我想出了三种可能的解决方案:

  1. 保留两个完全独立但高度冗余的类。
  2. 使用无参数构造函数创建一个公共(public)父类,这将导致不良行为,除非从一个特定的子类调用。
  3. 创建一个只有参数构造函数的公共(public)父类。然后,第一个类将其默认参数打包到 String 中,然后对其进行解析以再次派生参数。这会极大地影响性能。

是否有更好的解决方案,且没有所列解决方案的缺点?

编辑:

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

最佳答案

听起来选项 3 可能是您确定的三个选项中最好的一个。一种变体是让父类(super class)构造函数采用子类负责填充的 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。在不了解您的问题的详细信息的情况下,我们无法根据您的问题明智地讨论这些方法的优缺点。

这说明,如果原始类在设计时就考虑了继承,那么继承重用效果最好。至少您的上下文允许您考虑进行重大重构。在很多情况下,您都会受到对现有结构的依赖程度的限制。 (特别是“客户”代码中的依赖项。)

<小时/>

您对传递空映射“没有意义”的担忧可以通过使父类(super class)抽象来解决。子类需要提供“有意义的”2 个构造函数参数,具体取决于子类构造函数的用途。

<小时/>

1 - 例如,埃利奥特正在谈论的问题类型......

2 - Sensical(形容词)- 与 nonsensical 相反。

关于java - 在 Java 中管理继承时的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37222830/

相关文章:

java - 棘手的Java程序

java - JFace - 在给定的行索引处选择可编辑单元格?

c# - 获取声明类的名称?

java - 您可以定义抽象类的子类而不定义父类(super class)中定义的任何抽象方法吗?为什么?

JavaScript 继承——我做的对吗?

javascript - 在 javascript 继承方案中,参数在构造函数调用时变为未定义

java - 创建条目列表并使每个条目都可点击

java bean 验证 2.0 与 hibernate validator

java - 在 Facebook Graph API 中解析的数据不足

java - 需要类、接口(interface)或枚举