Java 股票列表-多态性设计

Java 股票列表-多态性设计,java,polymorphism,Java,Polymorphism,(我正在使用Java,因此添加了“Java”标记,以防它影响任何答案,但有些人可能会认为该标记是不必要的。) 考虑以下几点: 我有一个阳台/阳台需要进行图形化规划。作为最终计划的一部分,我需要列出建造阳台所需的所有材料。为了简化计算过程,我将阳台分成了不同的部分: 甲板上方-涉及塑料围栏组件和固定件(即螺钉、螺栓) 甲板下方-包括木材副框架和更多固定件。 …再加上其他我不会深入讨论的问题 由于我们提供的围栏设计不同,因此有100种不同的库存产品。每个项目都有自己的类别,包括尺寸、颜色、数量和

(我正在使用Java,因此添加了“Java”标记,以防它影响任何答案,但有些人可能会认为该标记是不必要的。)

考虑以下几点:

我有一个阳台/阳台需要进行图形化规划。作为最终计划的一部分,我需要列出建造阳台所需的所有材料。为了简化计算过程,我将阳台分成了不同的部分

甲板上方-涉及塑料围栏组件和固定件(即螺钉、螺栓)
甲板下方-包括木材副框架和更多固定件。

…再加上其他我不会深入讨论的问题


由于我们提供的围栏设计不同,因此有100种不同的库存产品。每个项目都有自己的类别,包括尺寸、颜色、数量和ID参考等信息

我想做的是创建每个部分所需的固定件列表,并将它们全部添加到一个最终列表中,无需任何重复。
最后一个想法是在已处理的计划旁边显示项目名称和数量


例如:

第1节要求:
-25个螺钉A
-15个螺钉B
-5个螺钉C

第2节要求:
-25个螺钉A
-15个螺钉B
-5个螺钉F

第3节要求:
-45 x螺钉B
-50 x螺钉C
-24个螺钉G

总列表
第1节+第2节+第3节={材料完整清单}


我的尝试/思考:

我上面提到的所有螺钉都有自己的等级,并扩展了超级等级“紧固件”。上述每个部分都有一个变量:

ArrayList<Fasteners>
ArrayList
因此,当我计算时,我可以将螺钉添加到这个变量中。一旦每个部分计算出它需要多少紧固件,我就把它们加在一起

我考虑过在“紧固件”超类中创建一个“add(Fixings)”方法,将所有重复项添加到一起。但是因为有100个项目,我认为编码不是很有效,并且怀疑有更好的方法利用我在这里设置的多态性。任何在线参考或提示都会很有帮助,非常感谢。

这里有一个建议:

制作一个名为FastenerType的枚举,然后使用
EnumMap
固定紧固件。我们叫它包吧

然后做一些类似的事情

public class FastenerBag {

  private Map<FastenerType, AtomicInteger> fasteners = new EnumMap<FastenerType, AtomicInteger>(FastenerType.map);

  FastenerBag(){
    // init your ints to zero
  }

  public void addFastenersFor(VerandaPart part){
    for (FastenerType type : FastenerType.values()){
      fasteners.get(type).addAndGet(part.getRequiredFasteners().get(type));
    }
  }

}
public class FastenerBag{
私有映射紧固件=新的EnumMap(FastenerType.Map);
FastenerBag(){
//将整数初始化为零
}
用于(阳台部分)的公共空间附加件{
for(FastenerType类型:FastenerType.values()){
紧固件.get(类型).addAndGet(part.getRequired紧固件().get(类型));
}
}
}
不要太担心性能。首先让它工作起来。然后让它可读(重构),然后优化。

这里有一个建议:

制作一个名为FastenerType的枚举,然后使用
EnumMap
固定紧固件。我们叫它包吧

然后做一些类似的事情

public class FastenerBag {

  private Map<FastenerType, AtomicInteger> fasteners = new EnumMap<FastenerType, AtomicInteger>(FastenerType.map);

  FastenerBag(){
    // init your ints to zero
  }

  public void addFastenersFor(VerandaPart part){
    for (FastenerType type : FastenerType.values()){
      fasteners.get(type).addAndGet(part.getRequiredFasteners().get(type));
    }
  }

}
public class FastenerBag{
私有映射紧固件=新的EnumMap(FastenerType.Map);
FastenerBag(){
//将整数初始化为零
}
用于(阳台部分)的公共空间附加件{
for(FastenerType类型:FastenerType.values()){
紧固件.get(类型).addAndGet(part.getRequired紧固件().get(类型));
}
}
}

不要太担心性能。首先让它工作起来。然后让它可读(重构),然后优化。

谢谢您的回复。我不熟悉Enum和EnumMap。我做了一个快速搜索,听起来很有希望。我将对此进行更深入的研究,然后再与您联系。您使用AtomicInteger是因为我可能使用线程吗?否则“int”就足够了吗?我使用它是因为你需要一些东西来包含int;您也可以使用整数,随时获取和放置它们,但这更简洁。我使用AtomicInt是因为它存在,我很懒:)你当然可以自己写。谢谢你的回复。我不熟悉Enum和EnumMap。我做了一个快速搜索,听起来很有希望。我将对此进行更深入的研究,然后再与您联系。您使用AtomicInteger是因为我可能使用线程吗?否则“int”就足够了吗?我使用它是因为你需要一些东西来包含int;您也可以使用整数,随时获取和放置它们,但这更简洁。我使用AtomicInt是因为它存在,我很懒:)当然你可以自己写。