【问题标题】:Instantiating Globally Accessible List After Runtime运行时实例化全局可访问列表
【发布时间】:2020-06-13 15:29:43
【问题描述】:

我有从数据库中检索的数据,然后使用list1.add() 添加到列表中。 List 1会有自己的项目类别,例如Sciencebooks,List2会有Fictionbooks,List3会有Cosmeticbooks等。从一开始就不知道会有多少个list的问题和数据库可以在任何给定时间使用list1list2list3list4、...list25...等来增加大小,因此对新列表的每个实例进行硬编码是行不通的,尤其是如果必须全局访问它们。

如果类别中的数据具有book_type:sciencebook,则据我所知,我无法在检索数据时创建并将列表命名为变量List<Object> (book_type value from data) = new ArrayList<>

我不想用 List 创建一个主列表,因为如果我尝试保持每个类别的索引组织,当我需要将新项目添加到单独的类别时,这会增加索引计数,我不希望必须为一个长列表而不是单独的列表逐个增加每个索引。除此之外,我不希望一个很长的列表必须循环/循环才能检索类别。

如何根据类别为列表添加标签并使其在全球范围内可用?

【问题讨论】:

    标签: java android android-studio arraylist


    【解决方案1】:

    另一个解决方案是使用 Spring 中常见的服务模式来轻松维护每个书籍列表。这样做的好处是您可以轻松地将功能添加到接口中,然后使用适配器模式创建一次功能,然后在需要时创建新服务。

    另一个重要方面是,如果需要,您可以使用 guice 等注入库轻松管理这些注入库的单个实例。

        interface Book {
            void read();
        }
    
        static class ScienceBook implements Book {
    
            @Override public void read() {
                System.out.println("Science book!");
            }
        }
    
        static class FictionBook implements Book {
            @Override public void read() {
                System.out.println("Fiction book!");
            }
        }
    
        interface BookService<B extends Book> {
    
            List<B> books();
    
        }
    
        static abstract class BookServiceAdapter<B extends Book> implements BookService<B> {
    
            private final List<B> books;
    
            protected BookServiceAdapter(List<B> books) {
                this.books = books;
            }
    
            @Override
            public List<B> books() {
                return books;
            }
    
        }
    
        static class FictionBookService extends BookServiceAdapter<FictionBook> {
    
            protected FictionBookService(List<FictionBook> books) {
                super(books);
            }
    
        }
    
        static class ScienceBookService extends BookServiceAdapter<ScienceBook> {
    
            protected ScienceBookService(List<ScienceBook> books) {
                super(books);
            }
    
        }
    
        public static void main(String[] args) {
            BookService<FictionBook> fictionBookService = new FictionBookService(Collections.singletonList(new FictionBook()));
    
            BookService<ScienceBook> scienceBookService = new ScienceBookService(Collections.singletonList(new ScienceBook()));
    
            fictionBookService.books().forEach(System.out::println);
    
            scienceBookService.books().forEach(System.out::println);
        }
    

    【讨论】:

    • 由于我不熟悉 guice,我将不得不研究它是如何工作的。
    • 当然。如果您需要帮助,请告诉我。
    【解决方案2】:

    对此的一种解决方案可能是使用 Map,其中键是书籍类型,值是书籍列表。

    此解决方案的问题在于,尽管您解决了重新创建相似列表的初始问题,但存在类型擦除,因为我们无法确切知道地图中每个键存储的图书类型。

    interface Book {
        void read();
    }
    
    class ScienceBook implements Book {
        @Override void read() { }
    }
    
    class FictionBook implements Book {
        @Override void read() { }
    }
    enum BookType {
        SCIENCE,
        FICTION;
    }
    
    Map<BookType, List<? extends Book>> books = new HashMap<>();
    
    List<Book> books = books.get(BookType.SCIENCE);
    

    【讨论】:

    • 是的。这是我不知道将来某个时候可能会添加哪种类型的书的问题,我将无法进入并添加一种新类型的书。这可能是我在这里发现的主要问题。如果我最终在数据库中添加例如 Cosmology,则 BookType 不会已经预定义了这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2016-07-27
    • 1970-01-01
    • 2013-05-18
    • 2013-11-12
    • 1970-01-01
    相关资源
    最近更新 更多