extend generic class 应该不那么通用
extend generic class which should be less generic
我正在从数据库中读入 2 个 class 批次中没有任何共同点的内容。
每个批次稍后存储在扩展 ArrayList 的批次 class 中
现在我需要获取每个批次中的每个对象并将其中的一些字段作为 JSON 通过 rabbitMQ 发送。
代码:
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
中的代码重复,我为 ObjecetA
和 ObjectB
创建了一个接口,并为所有批次创建了一个基础 class (如下图)。
代码:
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
中为每个代码一遍又一遍地编写相同方法的最佳方法批次类型
您可以尝试将 where 属性添加到您的 class。
怎么样:
public <T> void sendEvent(final List <? extends T> batch, Function <T, String> toJson) {
batch .forEach (value -> {
String json = toJson (value);
// send over rabbit
});
}
(我在 phone 上写作,对语法错误表示抱歉)
我正在从数据库中读入 2 个 class 批次中没有任何共同点的内容。 每个批次稍后存储在扩展 ArrayList 的批次 class 中 现在我需要获取每个批次中的每个对象并将其中的一些字段作为 JSON 通过 rabbitMQ 发送。
代码:
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
中的代码重复,我为 ObjecetA
和 ObjectB
创建了一个接口,并为所有批次创建了一个基础 class (如下图)。
代码:
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
中为每个代码一遍又一遍地编写相同方法的最佳方法批次类型
您可以尝试将 where 属性添加到您的 class。
怎么样:
public <T> void sendEvent(final List <? extends T> batch, Function <T, String> toJson) {
batch .forEach (value -> {
String json = toJson (value);
// send over rabbit
});
}
(我在 phone 上写作,对语法错误表示抱歉)