簡體   English   中英

在 Java 中存儲不同類型對象的有序列表的最佳方法?

[英]Best way to store an ordered list of objects that are of different types in Java?

我有幾個用於創建對象的類。 這些對象每個都有必須運行的代碼,具體取決於插入順序。

它們需要按順序存儲 - 並按存儲順序召回。

  1. 對象A
  2. 對象B
  3. 對象A
  4. 對象A
  5. 對象C
  6. 對象D

我不確定在 Java 中處理這個問題的正確方法是否是通用列表並在運行時檢查輸入。

List<Object> list = new ArrayList<Object>();

我還考慮過將每個對象類型存儲在它們自己的類型列表中,父對象以正確的順序從列表中讀取。 然而,這似乎比僅僅處理運行時檢查對象類型要復雜得多。

處理這個問題的正確“Java”方法是什么?

如果對象不共享一個共同的祖先:

這些類不相關。 他們沒有共同的祖先。

然后你可以做的是創建另一個類作為包裝器:

  1. T類型的對象。
  2. 一個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"); }
    }
}

GitHub 上的完整代碼

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM