使用另一个类的对象而不将其传递给构造函数

时间:2012-11-28 22:47:44

标签: java oop

我正在开发GUI应用程序(简单游戏),其中一个对象(我们称之为对象A)使用我直接加载的图像。我正在实现在游戏开始时加载图像的方法,这样我每次重新配置游戏时都不需要重新加载文件等。该方法将所有必要的图像作为数组加载,然后是另一种方法(BufferedImage[] getImages());返回此数组。该方法所使用的类(对象B,JPanel)绘制对象A,而对象A又由对象C(JFrame实例化,当然,它也实例化对象B)。

我想知道我是否可以直接从Object A的方法访问Object B的getImages()方法,而不通过方法调用传递引用。是完全可能的(通过ClassPath等),并且这样做是否是良好的编程习惯?

2 个答案:

答案 0 :(得分:0)

听起来你正在寻找单身人士模式。这样做:

public class ImageContainer {
    private final BufferedImage[] images = null;

    private static ImageContainer _instance = new ImageContainer();

    // NOTE PRIVATE CONSTRUCTOR
    private ImageContainer() {
        BufferedImage[] images = loadImages();
    }

    public static ImageContainer getInstance() {
        return _instance;
    }

    private BufferedImage[] loadImages() {
        // Do the loading image logic
    }

    // You might not want this in favor of the next method, so clients don't have direct access to your array
    public BufferedImage[] getImages() {
        return images;
    }

    public BufferedImage getImage(int index) {
        return BufferedImage[i];
    }
}

然后,只要您需要图像,只需执行

ImageContainer.getInstance().getImage(3);

您甚至可以使用EnumMap代替数组,以便更轻松地了解代码中要返回的图像。


顺便说一下,你可以阅读关于the different reasons when you would and would not use a static method here.

的精彩讨论

答案 1 :(得分:0)

只有当getImages是静态方法时,才可以调用B的getImages()方法而不需要引用。根据您的情况,这可能是也可能不是一个好主意。

另一种选择是使B成为“单身”类。 你可以大致这样做:

public class B {
  private static B theInstance;
  private bufferedImage[] images;
  private B() {
  }

  public static B getInstance() {
    if(theInstance == null) {
      theInstance = new B();
    }
    return theInstance;
  }

  public BufferedImage[] getImages() {
       if(images == null) {
            /* get the images */
       }
       return images;
  }
}

但请注意,单身人士不赞成单身人士。 替代方案是dependency injection