gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:55:56 25 4
gpt4 key购买 nike

目前,我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com