如何在Java中替换不同类中不同字段的类似代码?

如何在Java中替换不同类中不同字段的类似代码?,java,oop,for-loop,Java,Oop,For Loop,我正在从事一个Java项目,该项目有多个类,这些类具有来自其他类的对象的实例变量。例如,BigClassA对象有一个SmallClassA对象数组;BigClassB对象有一个SmallClassB对象数组 尽管BigClassA和BigClassB具有完全不同的字段,但它们与SmallClassA和SmallClassB进行类似的操作。请参阅下面的代码: public class BigClassA { // initialize all instance variables to 0

我正在从事一个Java项目,该项目有多个类,这些类具有来自其他类的对象的实例变量。例如,BigClassA对象有一个SmallClassA对象数组;BigClassB对象有一个SmallClassB对象数组

尽管BigClassA和BigClassB具有完全不同的字段,但它们与SmallClassA和SmallClassB进行类似的操作。请参阅下面的代码:

public class BigClassA {
    // initialize all instance variables to 0
    double totValue     = 0;
    double totGainLoss  = 0;
    SmallClassA[] smallClassArray = new SmallClassA[2];

    public BigClassA(int i, int j) {

        smallClassArray[0] = new SmallClassA(i);
        smallClassArray[1] = new SmallClassA(j);

        for (int k; k<smallClassArray.length; k++) {
            totValue    += totSmallClassArray[k].getValue();
            totGainLoss += totSmallClassArray[k].getGainLoss();
        }
    }
}

public class BigClassB {
    // initialize all instance variables to 0
    double totFoo   = 0;
    double totBar   = 0;
    double totPvsNP = 0;
    SmallClassB[] smallClassArray = new SmallClassB[3];

    public BigClassB (int p, int q, int r) {

        smallClassArray[0]  = new SmallClassB(p);
        smallClassArray[1]  = new SmallClassB(q);
        smallClassArray[2]  = new SmallClassB(r);

        for (int k; k<smallClassArray.length; k++) {
            totFoo      += smallClassArray[k].getFoo();
            totBar      += smallClassArray[k].getBar();
            totPvsNP    += smallClassArray[k].getPvsNP();
        }       
    }
}
公共类BigClassA{
//将所有实例变量初始化为0
双值=0;
双totGainLoss=0;
SmallClassA[]smallClassArray=新SmallClassA[2];
公共BigClassA(int i,int j){
smallClassArray[0]=新的SmallClassA(i);
smallClassArray[1]=新的SmallClassA(j);

对于(intk;k来说,抽象类似行为的标准方法是使用接口。 在您的例子中,您希望在列表的所有元素上构建一个总体

首先创建一个接口

public interface Summable {
   double getSum(); 
} 
现在在SmallClassA和SmallClassB中实现该接口。这会将大多数循环体转移到特定的类,例如SmallClassA

public SmallClassA implements Summable{
    public double getSum() {
       return getValue() + getGainLoss();
    }
}
现在,两个循环都可以写成

for ( Summable summable : smallClassArray ) {
   total += summable.getSum();
}

您也可以将其作为一种外部方法。

您提供的代码没有显示足够的公共部分,因此不值得进行这样的重构,但有一些方法可以实现。正如Maroun Maroun所建议的,您必须使用继承,但有许多步骤:

  • 确定
    SmallClassA
    SmallClassB
    之间的公共接口或抽象类。在最好的情况下,您将使用包含所有具有公共签名的方法的接口和包含公共代码的抽象类来定义这两个接口或抽象类
  • 识别
    BigClassA
    BigClassB
    之间的通用抽象类,用
    参数化
  • make
    class BigClassA扩展了CommonBigClass
    ,而
    B扩展了CommonBigClass
这样,您将避免以某种复杂性为代价的代码重复


注意:根据
SmallClassA
SmallClassB
的声明方式,它们的公共接口和/或超类也可能是泛型的。

应该会对您有所帮助。+1.Java8中有什么简明的方法可以循环数组并总结getter值吗?@marounnaroun:您会在哪里引入子类?使用Object创建一个方法数组作为参数并遍历对象数组。检查每个对象的instanceOf和所需的类,并具有if条件以获取值。我认为这是一种虚假重构的情况。任何你能想到的方法,你都必须传递关于你想要更新的字段和你想要更新的方法的信息不要让代码表面上的相似性导致您重构到一个深坑中。