【问题标题】:Java: accessing object created elsewhereJava:访问在别处创建的对象
【发布时间】:2021-01-25 23:56:57
【问题描述】:

这里有三个相互关联的问题。我已经尝试寻找答案,但我无法找到/应用可能的现有答案来解决我的问题。考虑以下类:

import java.util.ArrayList;
public class Container
{
    private ArrayList<Box> boxList = null;

    public Container()
    {
        this.infoList = new ArrayList<Box>();
    }

    public ArrayList<Box> getBoxList()
    {
        return this.boxList;
    }

据我了解,为了将此类用作稍后创建的Boxes 的容器,我必须构造它的一个实例,然后调用getter 方法来访问该列表。例如,

Container newContainer = new Container();
ArrayList<Box> list = newContainer.getBoxList();
... // Creating boxes and their contents
Box box = list.get(0); // First box in list
Item item = box.getItem(); // etc.

我可以在哪里与 item 合作。

问题 1: 据我所知,为了调用一个类的私有字段,需要该类的实例。如果我坚持保持拥有Container 的多个实例的可能性,为了访问上面在不同的类/方法中创建的newList,我是否必须继续将它作为参数传递给任何调用它的方法(那里会很多)?当然,另一个类中的方法不知道newList是什么。

问题 2:如果只打算存在一个 Container,最好只替换

private ArrayList<Box> boxList = null;

private static ArrayList<Box> boxList = new ArrayList<Box>;

然后去掉构造函数,将Container的所有方法声明为static,直接调用Container.getBoxList()

问题 3: 是否存在用于仅存储对象和处理对象(添加到列表、删除等)的类的常规通用设置,例如此处的 Container?该类与其他类的通信通常是如何实现的?

【问题讨论】:

    标签: java containers


    【解决方案1】:

    我认为您正在尝试做的事情称为单例设计模式 - 一个对象的实例应该只存在一个,并且应该可以全局访问。

    主要的工作方式本质上是,将类的实例作为静态属性附加到类:

    public class Container
    {
        private static Container instance = null;
        public static Container getInstance() {
            // create a singleton instance if one does not already exist
            if (instance == null) {
                instance = new Container();
            }
            // return the existing global instance
            return instance;
        }
        ...
    }
    

    或者,更简单地说:

    public class Container
    {
        private static Container instance = new Container();
        public static Container getInstance() {
            return instance;
        }
        ...
    }
    

    现在,在整个程序中,您需要做的就是导入 Container 类并调用 container.getInstance(),然后您就拥有了一个所有人共享的容器。


    如果您希望多个实例可以存在,您可以将构造函数保持为公开状态,就像目前一样。如果调用者不想要单例容器,他们可以以通常的方式实例化自己的容器。如果您希望集中访问多个实例,您可以将private static Container instance 替换为ListMap,并向getInstance() 添加参数以允许调用者选择他们想要的实例。

    或者,如果您只想在整个程序中强制执行一个实例,您可以将构造函数设为private(这样它只能在类内部调用,即在getInstance() 中) .

    您还可以根据您的特定需求以多种其他方式扩展设计模式。

    【讨论】:

      猜你喜欢
      • 2017-03-09
      • 1970-01-01
      • 2016-08-20
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 2016-05-03
      相关资源
      最近更新 更多