【问题标题】:How do I load an ArrayList that I can acces and manipulate from other classes without loading them more than once?如何加载可以从其他类访问和操作的 ArrayList,而无需多次加载它们?
【发布时间】:2021-03-31 11:18:05
【问题描述】:

假设我有一个名为 Product 的类,其中包含一个像这样的 counstructor

public Product(String name, double price, int barcode){
        this.name = name;
        this.barcode = barcode;
        this.price = price;
    }

然后我有另一个类 ImportData,它有一个方法可以将大量产品加载到返回 productList 的 List 中。

我现在想从不同的类访问这个列表,而不必再次将数据加载到 csv 文件中。 所以不要这样:

ImportFruitAndVegatables iFV = new ImportFruitAndVegatables();
List<Product> products = iFV.fillListWithProducts();

我想要这样的东西

mainController.products

因为我的 mainController 已经运行了该方法。像这样

List <Product> productList = importFruitAndVegatables.fillListWithProducts();

所以我的问题是:有没有什么方法你只需要运行一次这个方法就不需要再次运行了?谢谢!

【问题讨论】:

  • 有些事情我不是很清楚。 mainController 是什么?您能否提供更多代码以便我们获得更多上下文?通常,您可以使用延迟初始化来执行此操作:您加载一次列表并将其存储在内存中,然后对于所有后续调用,您检查您的列表是否已经加载,如果是,则返回您在内存中的列表。

标签: java list csv memory arraylist


【解决方案1】:

您至少可以通过以下方式共享对对象的引用:

  • Global variable。在 Java 中,这是在类上定义的静态变量。如果在您的应用执行期间应仅分配一次对象引用,则标记为 final
  • Singleton design pattern。在 Java 中,最好使用枚举来定义一个名为 INSTANCE 之类的对象。
  • 公共实例变量。如果List &lt;Product&gt; productListmainController 实例上的成员字段,则将该字段标记为public 允许任何其他代码调用mainController.productList
  • 将列表作为参数传递给方法。例如,定义一个方法,如public SalesReport produceSalesReport( List &lt;Product&gt; productList ) {…}
  • 返回对象引用的方法。这为lazy-loading 提供了机会,因为直到第一次调用此方法才实例化所需的对象。

您没有提供足够的详细信息来提出建议。通常最好使用返回列表的方法。

提示:通常最好提供列表的副本或不可修改的列表,这样调用程序员就不会干扰原始列表。见List.copyOf

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2018-05-06
    • 2012-01-20
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多