扩展应该不太通用的通用类

时间:2019-12-23 16:59:16

标签: java simplify

我正在从数据库中读取2个批次中没有共同点的类。 稍后将每个批次存储在扩展ArrayList的批次类上 现在,我需要获取每个批处理中的每个对象,并通过RabbitMQ将其某些字段作为JSON发送。

代码:

public class ObjectA {
  // Some members and methods
}

public class ObjectB {
  // Some members and methods
}

public class BatchA extends ArrayList<ObjectA> {
  // Some methods for ObjecetA
}

public class BatchB extends ArrayList<ObjectB> {
  // Some methods for ObjectB
}

public class EventClass {

    public void sendEvent(final BatchA batch) {
        // send over rabbit
    }

    public void sendEvent(final BatchB batch) {
        // same code as above
    }
}

为了避免EventClass中的代码重复,我为ObjecetAObjectB创建了一个接口,并为所有批次创建了一个基类(如下所示)。 / p>

代码:

public interface SomeInterface {
    String doSomething();
}

public class ObjectA implements SomeInterface {
    @Override
    public String doSomething() {
        return "Hello, world!";
    }

    public String doSomethingElse() {
        return "Goodbye, world!";
    }
}

public class ObjectB implements SomeInterface {
    @Override
    public String doSomething() {
        return "Hello universe!";
    }

    public String justDo() {
        return "I'm just doing stuff...";
    }
}

public class BasicBatch<T> extends ArrayList<SomeInterface> {
}

public class BatchA extends BasicBatch<ObjectA> {
    public void doBatch() {
        for (int i = 0; i < size(); i++) {
            System.out.println(get(i).doSomethingElse());
        }
    }
}

public class BatchB extends ArrayList<SomeInterface> {
    public void doBatch() {
        for (int i = 0; i < size(); i++) {
            System.out.println(get(i).justDo());
        }
    }
}

我知道这是行不通的(此代码甚至无法编译)-但我不确定这是避免针对每种批处理类型一遍又一遍地在EventClass中编写相同方法的最佳方法

2 个答案:

答案 0 :(得分:1)

怎么样:

public <T> void sendEvent(final List <? extends T> batch, Function <T, String> toJson) {
    batch .forEach (value -> {
         String json = toJson (value);
         // send over rabbit
    });
}

(我在写手机,对不起语法错误)

答案 1 :(得分:0)

您可以尝试将where属性添加到您的课程中。