0

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

我想知道是否可以getImages()直接从对象 A 的方法访问对象 B 的方法,而无需通过方法调用传递引用。是否完全有可能(通过 ClassPath 等),这样做是一种好的编程习惯吗?

4

2 回答 2

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);

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


顺便说一句,您可以在此处阅读有关何时使用和不使用静态方法的不同原因的精彩讨论。

于 2012-11-28T22:57:13.120 回答
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;
  }
}

但是请注意,有些人不赞成单身人士。另一种方法是依赖注入

于 2012-11-28T22:57:44.880 回答