[英]Best way to store an ordered list of objects that are of different types in Java?
我有幾個用於創建對象的類。 這些對象每個都有必須運行的代碼,具體取決於插入順序。
它們需要按順序存儲 - 並按存儲順序召回。
我不確定在 Java 中處理這個問題的正確方法是否是通用列表並在運行時檢查輸入。
List<Object> list = new ArrayList<Object>();
我還考慮過將每個對象類型存儲在它們自己的類型列表中,父對象以正確的順序從列表中讀取。 然而,這似乎比僅僅處理運行時檢查對象類型要復雜得多。
處理這個問題的正確“Java”方法是什么?
如果對象不共享一個共同的祖先:
這些類不相關。 他們沒有共同的祖先。
然后你可以做的是創建另一個類作為包裝器:
T
類型的對象。Consumer<T>
對象,用作對需要調用的代碼的引用。例如:
class Invocable<T> {
private final T target;
private final Consumer<T> invocation;
public Invocable(T target, Consumer<T> invocation) {
this.target = target;
this.invocation = invocation;
}
public void runInvocation() {
invocation.accept(target);
}
}
然后創建另一個管理List<Invocable>
的類,如下所示:
class RunnableList {
private List<Invocable<?>> invocables = new ArrayList<Invocable<?>>();
public <T> void add(T target, Consumer<T> invocation) {
invocables.add(new Invocable<T>(target, invocation));
}
public void run() {
invocables.forEach(Invocable::runInvocation);
}
}
就是這樣! 只需使用add(T target, Consumer<T> invocation)
方法將任何對象添加到RunnableList
中,當您完成添加所有對象(引用要調用的相應代碼)時,只需在RunnableList
上調用run
。
以下是一個完整的工作示例,嘗試一下以了解這個想法:
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class RunnableList {
private List<Invocable<?>> invocables = new ArrayList<Invocable<?>>();
public <T> void add(T target, Consumer<T> invocation) {
invocables.add(new Invocable<T>(target, invocation));
}
public void run() {
invocables.forEach(Invocable::runInvocation);
}
static class Invocable<T> {
private final T target;
private final Consumer<T> invocation;
public Invocable(T target, Consumer<T> invocation) {
this.target = target;
this.invocation = invocation;
}
public void runInvocation() {
invocation.accept(target);
}
}
// TEST
public static void main(String[] args) {
RunnableList runnableList = new RunnableList();
runnableList.add(new ClassA(), o -> o.run1("hello from A1"));
runnableList.add(new ClassB(), o -> o.run1("hello from B1"));
runnableList.add(new ClassC(), o -> o.run1("hello from C1"));
runnableList.add(new ClassA(), ClassA::run2);
runnableList.add(new ClassB(), ClassB::run2);
runnableList.add(new ClassC(), ClassC::run2);
runnableList.run();
}
static class ClassA {
public void run1(String msg) {
System.out.println("A.run1: " + msg);
}
public void run2() { System.out.println("A.run2"); }
}
static class ClassB {
public void run1(String msg) {
System.out.println("B.run1: " + msg);
}
public void run2() { System.out.println("B.run2"); }
}
static class ClassC {
public void run1(String msg) {
System.out.println("C.run1: " + msg);
}
public void run2() { System.out.println("C.run2"); }
}
}
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.